2013-01-15 17 views
7

Używamy ElasticSearch i mamy problemy podczas wyszukiwania terminów zawierających spację. Konkretny przykład: jest osoba o imieniu JM Bruno, ale podczas jej wyszukiwania nie są zwracane żadne wyniki. Niejasno pamiętam, że szukanie tego dokładnego terminu zwróciło wynik, ale nie mogę tego teraz odtworzyć.ElasticSearch dla warunków ze spacjami

Próbowałem dodać spację i "\" do mojego wzorca tokenizera, bez powodzenia. Ustawienia ES są następujące (przy użyciu gem opon w Ruby on Rails aplikacji)

module Search 
def self.included base 
base.send :include, Tire::Model::Search 
base.send :include, Tire::Model::Callbacks 

base.class_eval do 
    settings analysis: { 
       filter: { 
       ngram: { 
        type: 'nGram', 
        max_gram: 12, 
        min_gram: 3 
       }, 
       url_stop: { 
        type: "stop", 
        stopwords: %w[http https] 
       } 
       }, 
       tokenizer: { 
       url_email_tokenizer: { 
        pattern: '[^\w\-\[email protected]]+', 
        type: 'pattern' 
       } 
       }, 
       analyzer: { 
       url_analyzer: { 
        tokenizer: "url_email_tokenizer", 
        filter: %w[url_stop ngram], 
        type: "custom" 
       }, 
       name_analyzer: { 
        tokenizer: 'url_email_tokenizer', 
        filter: 'ngram', 
        type: 'custom' 
       } 
       } 
      } 


    end 
    end 
end 

Używamy tych tokenizers szukać nazw domen i adresów e-mail, jak również.

Odpowiedz

3

Spróbuj uruchomić _analyze API za pomocą analizatora, który zastosowałeś do swojego pola.

curl -XGET 'localhost:9200/_analyze?analyzer=name_analyzer' -d 'JM Bruno' 

Zobaczysz jak Elasticsearch łamie zawartości pola do tokenów i dlatego nie można go szukać za pomocą TermQuery. Narzędzie TermQuery nie jest analizowane, więc porównuje zapytanie dokładnie z odwróconym indeksem.

+0

zwraca kod 400 z błędem „nie udało się znaleźć analizatora”. Czy ES nie jest świadomy tego, czego używam w ustawieniach w klejnocie opon, jeśli chodzi o analizatory? – HannesFostie

+0

Wypróbuj MyModel.index.analyze "Mój tekst", analizator: "name_analyzer" – karmi

+0

zorientowałem się, że muszę dodać indeks, ale odpowiedź nie znaczy dla mnie wiele. Z pewnością znajdzie garść tokenów, ponieważ spodziewałbym się, że zostaną zenkcjonowani przez ngram, ale to nie wyjaśnia, dlaczego nie jest uwzględnione w wyszukiwaniu (przynajmniej, to nie jest dla mnie jasne). – HannesFostie

0

Napotkaliśmy ten sam problem i jedyną rzeczą, do której doszedłem, było zastąpienie znaków spacji "?" dzika karta. Wyglądało to jak domyślny tokenizer, a także ten, którego konkretnie szukałem w wyszukiwaniu ciągów zapytań, zostały zignorowane.

Powiązane problemy