当令牌生成器在连字符上拆分单词时,Lucene不尊重AND运算符

时间:2019-03-09 14:54:12

标签: java lucene

我有一个包含多个字段的lucene索引。假设我有一行包含 00-12345 ,另一行包含 00-99999 。如果对 00-12345 进行多字段搜索,则会找到两者。如果我使用 OR 运算符,那么我会理解:令牌生成器在连字符上拆分,并且都包含 00 ,因此它们匹配。但是,如果使用 AND 运算符,则只希望匹配 00-12345 的运算符。但是,即使使用 AND 运算符,如果我搜索 00-12345 ,这两行也会匹配。但是,如果我搜索 00 12345 ,则只有一行匹配! (这使用 AND -两者都使用 OR 进行匹配)。当然,如果令牌生成器在连字符上进行分割(这很公平),那么对 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 ,它缺少+来强制执行 AND

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

所以我想它是解析器。我想我的问题是我使用解析器是否错误,这是预期的行为还是错误?

0 个答案:

没有答案