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.
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
Nie widziałem części vice-versa. Więc chcesz też uderzyć "b"? czy jest minimalna długość? – Thilo
Tak, są przypadki, w których chciałbym również nacisnąć "b". Wyobraź sobie pole "first_name" z samą treścią "D" ... –