2017-01-24 1 views
0

Мы используем бета-версию Lucene.net - Lucene.net 48. Мы хотим предоставить поддержку для not like с использованием объекта запроса lucene. Мы используем класс WildcardQuery для поддержки диких карт и с помощью boolean clause как «BooleanClause.Occur.MUST_NOT».Предложение MUST_NOT не работает с WildcardQuery в версии Lucene.net 48 и поддерживает предложение «Is Null» и «Is not Null»

Это генерирующий запрос ->: "-company:lucene*".

Он имеет знак «-» перед запросом, но он не возвращает данные, где компания не похожа на lucene*. В идеале, он должен вернуть 'эластичным', 'MongoDB' и т.д.

WildcardQuery qfWildcard = new WildcardQuery(new Term("company","lucene*")); 
BooleanQuery bq = new BooleanQuery(); 
bq.Add(qfWildcard, BooleanClause.Occur.MUST_NOT); 

На другом пути, WildcardQuery с MUST пункт работает.

Запрос ->: "+company:lucene*".

Он имеет знак «+» перед запросом и возвращает данные, где компания «lucene *». Он возвращается «Lucene», «Lucene.Net» и т.д.

WildcardQuery qfWildcard = new WildcardQuery(new Term("company","lucene*")); 
BooleanQuery bq= new BooleanQuery(); 
bq.Add(qfWildcard, BooleanClause.Occur.MUST); 

Пожалуйста, помогите мне, если кто-нибудь знает о решении с использованием WildcardQuery класса или любого другого класса или какой-либо альтернативный способ решения этой проблемы.

Пожалуйста, дайте мне знать, если есть способ поддержать - 'Is Null' and 'Is Not Null' статья.

+0

«Нуль» и «Не является нулевым», может поддерживаться путем хранения всех полей в индексном документе. Но, я ищу поле синтаксиса/api, существует в документе или нет. Если какое-либо поле не существует в индексированном документе, это означает, что оно равно «null». И, если поле существует в документе с индексированным документом, оно «не равно нулю». Не найдено ни одного api/класса в версии lucene.net 48. –

ответ

1

Выполнение запроса только с условием MUST_NOT не будет работать. В предложении MUST_NOT только что он говорит, он указывает, какие документы не должны совпадать. В нем ничего не говорится о том, какие документы должны соответствовать, и не подразумевает, что все остальное должно быть восстановлено (further discussion here).

Вы должны всегда иметь SHOULD или MUST в вашем BooleanQuery. Чтобы соответствовать всем остальным, вы можете использовать MatchAllDocsQuery.

WildcardQuery qfWildcard = new WildcardQuery(new Term("company","lucene*")); 
BooleanQuery bq = new BooleanQuery(); 
bq.Add(qfWildcard, BooleanClause.Occur.MUST_NOT); 
bq.Add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD); 
Смежные вопросы