2016-03-08 4 views
1

Привет, ребята у меня есть вопрос :)Lucene BooleanQuery.Builder Строить не работает

создать BooleanQuery Как это:

BooleanQuery.Builder qry = new BooleanQuery.Builder(); 
qry.add(new TermQuery(new Term("Name", "Anna")), BooleanClause.Occur.SHOULD); 

И если я делать поиск, как это сейчас:

TopDocs docs = searcher.search(qry.build(), hitsPerPage); 

Результаты поиска нулевые? Но если я использую этот код:

TopDocs docs = searcher.search(parser.parse(qry.build().toString()), hitsPerPage); 

Тогда я получаю правильные результаты? Можете ли вы объяснить мне, почему мне нужно снова разобрать его?

Я использую версию 5.5.0 и имя является TextField

ответ

3

TextField пробегов данных через анализатор и, вероятно, будет производить термин "anna" (в нижнем регистре). A TermQuery ничего не запускает через анализатор, поэтому он ищет "Anna" (верхний регистр), и это не соответствует. Создайте TermQuery с нижним регистром, и вы должны увидеть результаты: new TermQuery(new Term("Name", "anna")). BooleanQuery не имеет ничего общего с этим, на самом деле этот конкретный запрос переписывает себя в базовый TermQuery, так как это единственный подзапрос. Парсер берет строку "Name:Anna" (производится TermQuery), запускает ее через анализатор и дает вам "Name:anna"TermQuery, поэтому он работает, если вы запускаете запрос через синтаксический анализатор - он включает в себя необходимый этап анализа.

+0

Ah okay Спасибо Очень много :) и где я могу установить Игнорировать Кейс? – Montezuma

+1

Lucene на самом деле не работает таким образом, что вы можете где-то установить игнорировать регистр. Все зависит от вашего анализатора. Большинство анализаторов включают в себя нижний регистр токенов, который будет содержать все. Вы должны убедиться, что ваш запрос выполняется через совместимый анализатор (в идеале такой же), чтобы были созданы соответствующие маркеры. TermQuery не использует анализатор, поэтому вам необходимо выполнить этот шаг заранее, например. используя анализатор запросов, который запускает материал через анализатор (фактически не создавая BooleanQuery). – knutwalker