2012-09-07 13 views
6

Używam analizator śnieżki w moim poszukiwaniu ciąg kwerendy ... jak takElasticsearch z analizatorem śnieżki zwraca jedynie wyniki dla wynikała słowa

"query" : { 
     "query_string" : { 
     "query" : the-query-string-goes-here, 
     "default_operator" : "AND", 
     "analyzer" : "snowball" 
     } 
    } 

to faktycznie działa, ale robi coś dziwnego ... szukając " walka "zwróci wyniki dla" walki ", ale ignoruje wyniki dla" walki ". Poszukiwanie "załogi" zwróci wyniki dla "załogi", ale nie "załogi", również poszukiwanie "załogi" również ignoruje wyniki dla "załóg" ...

Ktoś wie, co się dzieje?

+0

Czy rozwiązałeś? Czy mogę wiedzieć, czy moja odpowiedź była przydatna? – javanna

+0

Ustawiłem domyślny analizator jako kulę śnieżną i to się nią zajęło, ale nadal nie rozumiem, dlaczego samo ustawienie jej w ciągu zapytania nie zadziałało. Czym różni się indeksowanie, że wyszukiwanie walki w jednym przypadku (domyślny analizator ustawiony jest na kulę śnieżną) może faktycznie wywołać post "walczący", ale drugi (po prostu podając go w ciągu zapytania) nie ma. – concept47

+0

Tak jak napisałem w mojej odpowiedzi, jeśli zastosujesz wyrażenie tylko w czasie zapytania, skończysz wyszukiwanie łodyg w polu, które nie zostało wyparte podczas indeksowania. Cieszę się, że rozwiązałeś! – javanna

Odpowiedz

11

Stemming ma sens, gdy stosuje się go zarówno w czasie indeksu i czasu zapytania. Teraz stosujesz go w czasie zapytania, aby wyszukać łodygi słów, które są częścią zapytania. Ale domyślam się, że indeks nie zawiera łodyg, ponieważ nie zastosowałeś wartościowania w czasie indeksowania. W rzeczywistości wyszukujesz w polu _all, ponieważ nie podano żadnej nazwy pola ani w zapytaniu, ani przy użyciu atrybutu default_field (lub fields) obsługiwanego przez ciąg query_string. Pole _all jest domyślnie analizowane przy użyciu StandardAnalyzer.

Istnieją różne sposoby rozwiązania tego problemu. Osobiście zdecyduję się na zestaw pól, które chcesz przeszukać w swoim zapytaniu i zastosować do nich w wyniku mapowania. Po tym czasie nie trzeba określać analizatora w zapytaniu, ponieważ zostanie użyty skonfigurowany analizator dla pola, którego szukasz.

Daj mi znać, jeśli odpowiedź jest wystarczająco jasna.

+0

To ma wiele sensu. Ale dlaczego miałby ignorować element, który jest dokładnie zgodny z zapytaniem? (szukanie "walki" nie zwróci postu zatytułowanego "walczący", ale zwraca post zatytułowany "walka") – concept47

+0

, ponieważ kiedy zastosujesz wyrażenie "walka", walka zostanie podjęta. Naprawdę szukasz walki, a nie walki. ;) – javanna

+0

, więc to oznacza, że ​​mój problem nadal istnieje, nawet jeśli użyłbym łodygi na indeksie? Jak mogę to zrobić, aby przeszukał zarówno wywodzące się słowo, jak i aktualne zapytanie .... Sphinx robi to automatycznie, trochę zaskoczony implementacją tutaj – concept47

2

Dzięki @javanna za skierowanie mnie we właściwym kierunku. Rozwiązałem to, ustawiając analizator dla pola _all na . Szczegóły: this doc.

Używam opon gem Ruby, a ja byłem w stanie określić odwzorowanie w moim modelu, co następuje:

mapping(_all: { analyzer: 'snowball' }) do 
    indexes :id, type: 'integer' 
    indexes :description 
    indexes :name, boost: 10 
end 

I sformatowany moje zapytanie dokładnie jak w oryginalnym pytanie.

Powiązane problemy