Почему этот запрос Lucene содержит вместо startWith?

string q = "m";
Query query = new QueryParser("company", new StandardAnalyzer()).Parse(q+"*");

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

Тем не менее, я получу такие результаты, как "Fleet Africa", где довольно очевидно, что A не в начале и, таким образом, дает мне нежелательные результаты.

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

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

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

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

Что я делаю неправильно?


person Boris Callens    schedule 03.03.2009    source источник


Ответы (2)


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

Если вы хотите рассматривать «Fleet Africa» как один термин, используйте анализатор, который не разбивает вашу строку на пробелы. KeywordAnalyzer является примером, но вы все же можете захотеть ввести данные в нижний регистр, чтобы запросы не были чувствительны к регистру.

person sisve    schedule 30.03.2011

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

person Yuval F    schedule 03.03.2009
comment
Конечно, пример слишком надуманный, правда? Разве нельзя создать начальный запрос подобным без всякой ерунды? - person Boris Callens; 03.03.2009
comment
Не то, что я знаю из. startwith сложно. Если вам это удастся, дайте мне знать. Насколько я понимаю, PrefixQuery означает поиск начала любого термина, а не только первого. - person Yuval F; 03.03.2009
comment
Это меня действительно удивляет. Наверное, самый простой запрос - "начать с", не так ли? - person Boris Callens; 03.03.2009
comment
У меня прямо противоположная проблема, для меня Lucene по умолчанию выполняет StartsWith, но мне нужен Contains, и я не знаю, как этого добиться. Какую версию / анализатор вы используете? Я использую 2.9 / StandardAnalyzer. Также мой вопрос находится по адресу: stackoverflow.com/questions/5484965/ - person ntziolis; 30.03.2011