2016-06-08 21 views
6

Mam link taki jak http://drive.google.com i chcę dopasować "google" z linku.Jak wykonać częściowe dopasowanie w Elasticsearch?

mam:

query: { 
    bool : { 
     must: { 
      match: { text: 'google'} 
     } 
    } 
} 

Ale to tylko mecze, jeśli cały tekst jest „google” (wielkość liter, dlatego też mecze Google lub Google itp). Jak pasuje do "google" w innym ciągu?

+0

Być może 'match: {text: '. * Google. *'}' Może pomóc. –

+0

Awesome that worked! Czy możesz umieścić swoją odpowiedź jako "odpowiedź", więc mogę wybrać ją jako najlepszą? – user3835653

+0

Dodałem odpowiedź i dostarczyłem odpowiednie odniesienie. –

Odpowiedz

5

Chodzi o to, że regex ElasticSearch używasz requires a full string match:

Lucene wzory są zawsze zakotwiczone. Podany wzór musi pasować do całego ciągu znaków.

Dlatego, aby dopasować dowolny znak (ale nowa linia), można użyć .* wzoru:

match: { text: '.*google.*'} 
       ^^  ^^ 

Jeszcze jeden wariant jest dla przypadków, gdy ciąg może mieć nowe linie: match: { text: '(.|\n)*google(.|\n)*'}. To okropne (.|\n)* jest koniecznością w ElasticSearch, ponieważ ten regexowy smak nie dopuszcza żadnych obejść [\s\S] ani żadnych flag DOTALL/Singleline. "The Lucene regular expression engine is not Perl-compatible but supports a smaller range of operators."

+0

To nie działa dla mnie. – Battousai

+0

@Battousai Możesz zadać pytanie. Najprawdopodobniej występuje problem z * jak * używasz regex. –

0

Aby uzyskać bardziej ogólne rozwiązanie, można skorzystać z innego analizatora lub zdefiniować własny. Zakładam, że używasz standardowego analizatora, który podzieliłby http://drive.google.com na tokeny "http" i "drive.google.com". Dlatego wyszukiwanie tylko google nie działa, ponieważ próbuje porównać go do pełnego "drive.google.com".

Jeśli zamiast tego zindeksowałeś dokumenty za pomocą prostego analizatora, podzielisz go na "http", "dysk", "google" i "com". Umożliwi to samodzielne dopasowanie dowolnego z tych warunków.