Как я могу использовать Lucene для поиска документов, которые не содержат термин? - PullRequest
2 голосов
/ 04 ноября 2011

Мне известно, что в документации Lucene написано

Примечание. Оператор NOT нельзя использовать только с одним термином. Например, следующий поиск не даст результатов:

НЕ "Джакарта апач"

Однако я хотел бы иметь возможность сформировать запрос, который возвращает все документы, НЕ содержащие термин. Я рассмотрел связывание MatchAllDocsQuery и TermQuery в BooleanQuery , но, похоже, не могу найти правильную комбинацию.

Если я проиндексировал следующие два документа

Doc0: content:The quick brown fox jumps over the lazy dog.
Doc1: (empty string)

Запрос *:* -content:fox возвращает оба документа, когда я просто хочу один документ.

RegexQuery content:^((?!fox).)*$, предложенный этим ответом StackOverflow возвращает один документ, но, похоже, он работает неправильно, поскольку content:^((?!foo).)*$ возвращает также один документ, когда я ожидаю, что он возвратит два документа.

Я знаю о влиянии на производительность того, что я хочу сделать. Запрос будет выполняться только для нескольких документов, поэтому я не слишком беспокоюсь о производительности.

Есть ли способ написать запрос Lucene, чтобы получить то, что я хочу?

Ответы [ 2 ]

5 голосов
/ 07 ноября 2011

Вы можете использовать все совпадения и исключить термин -

IndexSearcher searcher = new IndexSearcher("path_to_index");
MatchAllDocsQuery everyDocClause = new MatchAllDocsQuery();
TermQuery termClause = new TermQuery(new Term("text", "exclude_term"));
BooleanQuery query = new BooleanQuery();
query.add(everyDocClause, BooleanClause.Occur.MUST);
query.add(termClause, BooleanClause.Occur.MUST_NOT);
Hits hits = searcher.search(query);  

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

+dummy_field:dummy_value -exclude_term
1 голос
/ 04 ноября 2011

Разве вы не можете добавить «искусственный» токен к каждому документу, а затем искать «добавленный токен», а не «то, чего вы хотите избежать»? *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...