2013-05-13 2 views
1

나는 ElasticSearch와 Tire를 사용하여 몇 가지 기본 검색 기능을 수행하고 있지만 스노볼 스터 밍 분석기의 기본 구성은 저를 혼란스럽게합니다. 나는 거의 GitHub의 페이지에서 다음 코드 예제 해요 : https://github.com/karmi/tire타이어 라이브러리를 사용하여 스템밍

여기에 루비 샘플 파일 (루비 1.9.3, 타이어 1.8.25)이다 : 나는 항복이 예상 한 것

require 'tire' 

Tire.index 'videos' do 
    delete 
    create :mappings => { 
    :video => { 
     :properties => { 
     :code    => { :type => 'string' }, 
     :description   => { :type => 'string', :analyzer => 'snowball' } 
     } 
    } 
} 
end 

videos = [ 
    { :code => '1', :description => "some fight video" }, 
    { :code => '2', :description => "a fighting video" } 
] 

Tire.index 'videos' do 
    import videos 
    refresh 
end 

s = Tire.search 'videos' do 
    query do 
     string 'description:fight' 
    end 
end 

s.results.each do |document| 
    puts "* #{document.code} - #{document.description}" 
end 

은 싸움과 싸움이 같은 줄기를 가지고 있기 때문에 경기의 두 기록.

* 1 - some fight video 

이 기본 분석기 내가 구성하고있어 하나보다는 사용되고 있음을 나타냅니다 : 그러나, 그것은 단지 첫 번째 레코드를 반환합니다.

이 질문에 대한 쿼리 문자열 (ElasticSearch mapping doesn't work)의 실제 필드를 전달하고이 코드를 성공적으로 실행하여 ElasticSearch 설치가 정상적으로 처리되었음을 알고 있습니다.

Tire가이 쿼리에 대해 두 레코드를 반환하려면 무엇을 변경해야합니까? (즉, 여기서 형태소 분석이 어떻게 작동합니까?)

답변

0

싸움과 싸움에 같은 줄기가 있기 때문에이 두 경기가 모두 일치하는 것으로 예상했습니다. 그러나 첫 번째 레코드를 반환합니다 :

오른쪽. '싸움'은 '싸움'에 유래하여 '싸움'만있는 결과를 반환합니다. 파이팅은 검색 색인을 다르게 설정하지 않으면 똑같은 일을합니다.

당신이 묘사하는 방식대로 행동하기를 원한다면, "싸움"이 "싸움"과 일치하고 그것을 반환하도록 기본 색인이 가장자리 ngram 분석기를 사용하게 할 수 있습니다. 이것은 또한 "싸움"을 묻는 질문에 '싸움'과 '싸움'을 일치시키는 바람직한 효과라고 생각합니다.

0

글쎄, 그것은 내 부분에 꽤 간단한 오류로 밝혀졌다. 나는 비디오를 정의하는 해쉬에 "type"을 포함하는 것을 게을리했다.

videos = [ 
    { :type => 'video', :code => '1', :description => "some fight video" }, 
    { :type => 'video', :code => '2', :description => "a fighting video" } 
] 

videos = [ 
    { :code => '1', :description => "some fight video" }, 
    { :code => '2', :description => "a fighting video" } 
] 

교체 문제를 해결했습니다.

코드 변경 효과는 설명 필드에 올바른 분석기를 적용하는 것이 었습니다. 이전에는 스노우 볼 분석기가 검색 쿼리에만 적용되어 검색 쿼리의 결과가 달라졌습니다. 쿼리 문에 "description : fighting"을 입력하면 "fighting video"가 아닌 "some fight video"라는 첫 번째 결과와 여전히 일치합니다. 이것은 기록이 정확하게 분석되고 있지 않다는 것을 나에게 알려 줬다.

관련 문제