У меня есть индекс 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 ))
Так что я думаю, что это как-то парсер. Наверное, мои вопросы: я неправильно использую парсер, это ожидаемое поведение или это ошибка?