Lucene не уважает оператор AND, когда токенизер разбивает слова на дефис - PullRequest
0 голосов
/ 09 марта 2019

У меня есть индекс lucene с несколькими полями. Допустим, у меня есть строка, содержащая 00-12345 , а другая содержит 00-99999 . Если выполнить поиск по многопользовательскому полю 00-12345 , он найдет оба. Если я использую оператор ИЛИ , то понимаю, что токенизер разделяется на дефис, и оба содержат 00 , поэтому они совпадают. Однако, если я использую оператор AND , я ожидаю, что совпадет только тот, с 00-12345 . Тем не менее, даже с оператором AND обе строки совпадают, если я ищу 00-12345 . Однако, если я ищу 00 12345 , то совпадает только одна строка! (Это использует И - оба совпадают, используя ИЛИ из). Конечно, если токенизатор разделяется на дефис (что достаточно справедливо), тогда поиски 00-12345 и 00 12345 должны возвращать одинаковые значения?

Я использую код вроде:

BooleanQuery.Builder querybuilder = new BooleanQuery.Builder();

MultiFieldQueryParser freeTextParser = new MultiFieldQueryParser(fieldsToSearch, new StandardAnalyzer());

freeTextParser.setDefaultOperator(Operator.AND);

querybuilder.add(freeTextParser.parse(searchString), BooleanClause.Occur.FILTER);

// Other stuff here searching specific fields

Query query = querybuilder.build();
IndexReader reader = DirectoryReader.open(index);
IndexSearcher searcher = new IndexSearcher(reader);
Integer startFrom = (pageNum - 1) * pageSize;
Sort sort = getSort(sortCriteria);
TopFieldCollector collector = TopFieldCollector.create(
    sort,
    startFrom + pageSize,
    true, // fillFields
    false, // trackDocScores
    false, // trackMaxScore
    true); //trackTotalHits
searcher.search(query, collector);
TopDocs docs = collector.topDocs(startFrom, pageSize);

Если я отлаживаю query.toString() Я вижу разницу. Поисковый запрос 00 12345 дает запрос как

#departureDate:[2019-02-06T00:00:00 TO 2019-02-18T00:00:00] #(+(foo:00 bar:00) +(foo:12345 bar:12345))

в то время как для 00-12345 отсутствует + для принудительного применения И :

#departureDate:[2019-02-06T00:00:00 TO 2019-02-18T00:00:00] #((foo:00 bar:00) (foo:12345 bar:12345 ))

Так что я думаю, что это как-то парсер. Наверное, мои вопросы: я неправильно использую парсер, это ожидаемое поведение или это ошибка?

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