Почему этот запрос Lucene является «содержит» вместо «начинается с»? - PullRequest
5 голосов
/ 03 марта 2009
string q = "m";
Query query = new QueryParser("company", new StandardAnalyzer()).Parse(q+"*");

приведет к тому, что запрос будет префиксомQuery: company: a *

Тем не менее, я получу результаты, такие как «Флот Африка», где довольно очевидно, что буква А не находится на старте и поэтому дает мне нежелательные результаты.

Query query = new TermQuery(new Term("company", q+"*"));

приведет к тому, что запрос будет termQuery: company: a * и не вернет никаких результатов. Возможно, потому что он интерпретирует запрос как точное совпадение, и ни одно из моих значений не является литералом "a *".

Query query = new WildcardQuery(new Term("company", q+"*"));

вернет те же результаты, что и префиксный запрос;

Что я делаю не так?

Ответы [ 2 ]

5 голосов
/ 30 марта 2011

StandardAnalyzer будет размечать «Флот Африка» на «Флот» и «Африка». Ваш поиск * будет соответствовать более позднему термину.

Если вы хотите рассматривать «Флот Африка» как единый термин, используйте анализатор, который не разбивает вашу строку на пробелы. KeywordAnalyzer - это пример, но вы все равно можете использовать строчные буквы в данных, чтобы запросы не учитывали регистр.

0 голосов
/ 03 марта 2009

Краткий ответ: все ваши запросы не ограничивают поиск началом поля. Вам нужен EdgeNGramTokenFilter или что-то в этом роде. См. этот вопрос для реализации автозаполнения в Lucene.

...