2012-11-15 10 views
7

Chciałbym, aby Lucene znalazła dokument zawierający wyrażenie "bahnhofstr", gdy szukam "bahnhofstrasse", tj. chcesz tylko znaleźć dokumenty zawierające warunki, których moje wyszukiwane hasło jest prefiksem, ale także dokumenty zawierające terminy, które same są prefiksem mojego wyszukiwanego hasła ...Szukaj terminów w indeksie, które są przedrostkiem wyszukiwanego hasła lub odwrotnie (!)

Co mam zrobić?

+0

pokrewne (ale bez odpowiedniej odpowiedź dla Ciebie, po prostu mówi: „Tak , możesz "): http: // stackoverflow.com/questions/10671755/lucene-prefix-search-for-indexed-data-through-standard-analyzer – Thilo

+1

Nie widziałem części vice-versa. Więc chcesz też uderzyć "b"? czy jest minimalna długość? – Thilo

+0

Tak, są przypadki, w których chciałbym również nacisnąć "b". Wyobraź sobie pole "first_name" z samą treścią "D" ... –

Odpowiedz

0

Myślę, że zapytanie fuzzy może być dla Ciebie najbardziej przydatne. W ten sposób ocenisz warunki na podstawie odległości Levenshtein od zapytania. Bez określonego minimalnego podobieństwa skutecznie dopasuje każdy dostępny termin. To może sprawić, że będzie mniej niż wydajna, ale osiągnie to, czego szukasz.

A fuzzy zapytanie jest sygnalizowana przez ~ charakteru, takie jak:

firstname:bahnhofstr~ 

Albo o minimalnej podobieństwa (liczba między 0 a 1, gdzie 0 oznacza loosest bez minimum)

firstname:bahnhofstr~0.4 

Lub jeśli są konstruowania własnych zapytań, użyj FuzzyQuery

to nie jest całkiem Dokładnie to, co podałeś, ale jest najprostszym sposobem, aby zbliżyć.

Jeśli chodzi o dokładnie to, czego szukasz, nie znam prostego połączenia Lucene, aby to osiągnąć. I pewnie właśnie podzielić termin do serii termqueries, że można reprezentować w zapytaniu strun coś takiego:

firstname:b 
firstname:ba 
firstname:bah 
firstname:bahn 
firstname:bahnh 
firstname:bahnho 
firstname:bahnhof 
firstname:bahnhofs 
firstname:bahnhofst 
firstname:bahnhofstr* 

nie będę faktycznie generuje ciąg kwerendy za to siebie, przy okazji. Po prostu sam skonstruowałbym obiekty TermQuery i PrefixQuery.

Punktacja byłaby nieco zniekształcona i prawdopodobnie zwiększałbym znacznie dłuższe zapytania, aby uzyskać lepsze uporządkowanie, ale jest to metoda, która przychodzi do głowy, aby osiągnąć dokładnie to, czego szukasz dość łatwo. A DisjunctionMaxQuery pomoże ci użyć czegoś takiego z innymi warunkami i uzyska bardziej rozsądną punktację.

Mam nadzieję, że zapytanie rozmyte działa dobrze dla Ciebie. Wydaje się o wiele ładniejsze rozwiązanie.

Inną opcją, jeśli masz dużo potrzeby zapytań tego typu, może być, gdy indeksowanie, tokenize pola do n-gramów (patrz NGramTokenizer), które pozwalają na efektywne użycie NGramPhraseQuery aby osiągnąć rezultaty chcesz.

1

Jeśli dobrze Cię rozumiem, a Twój ciąg wyszukiwania jest dokładnym ciągiem znaków, możesz ustawić w Lucene queryParser.setAllowLeadingWildcard(true);, aby umożliwić wyszukiwanie według znaków wieloznacznych (które może ale nie musi być wolne - widziałem je dość szybko, ale w przypadek, w którym było tylko 60 000 dokumentów Lucene).

Twój przykład składni zapytania mógłby wyglądać następująco:

*bahnhofstr bahnhofstr* 

lub ewentualnie (nie testowałem tego) tylko:

*bahnhofstr* 
Powiązane problemy