【问题标题】:Java Lucene - different results for BooleanQuery and QueryParser Query for same Lucene Query LanguageJava Lucene - 相同 Lucene 查询语言的 BooleanQuery 和 QueryParser 查询的不同结果
【发布时间】:2017-01-03 14:17:27
【问题描述】:

我观察到一个奇怪的行为,但我看不出我做错了什么。

我通过多个 BooleanQueries 创建了以下查询:

+(-(Request.zipCode:18055 Request.zipCode:33333 Request.zipCode:99999) +Request.zipCode:[* TO *]) *:*

...这是我通过toString得到的

更新:这样我创建了 BooleanQuery 的一部分,它负责创建这个 sn-p +Request.zipCode:[* TO *])

Query fieldOccursQuery = new TermQuery(new Term(queryFieldName, "[* TO *]"));

我通过 QueryParser 创建了完全相同的(根据我的理解)查询,如下所示:

String querystr = "+(-(Request.zipCode:18055 Request.zipCode:33333 Request.zipCode:99999) +Request.zipCode:[* TO *]) *:*";
Query query = new QueryParser(Version.LUCENE_46, "title", LuceneServiceI.analyzer).parse(querystr);

我以同样的方式处理它们:

IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
int max = reader.maxDoc();
TopScoreDocCollector collector = TopScoreDocCollector.create(max > 0 ? max : 1, true);
searcher.search(query, collector);
....
    ScoreDoc[] hits = collector.topDocs().scoreDocs;
    Map<Integer, Document> docMap = new TreeMap<Integer, Document>();
    for (int i = 0; i < hits.length; i++) {
        docMap.put(hits[i].doc, indexSearcher.doc(hits[i].doc));
    }

不同的结果

在类似的索引上:stored,indexed,tokenized,omitNorms,indexOptions=DOCS_ONLY&lt;Request.zipCode:04103&gt;

  • 通过 QueryParser 的查询按预期交付一个文档

  • 通过 BooleanQuery 的查询未提供 1 个预期文档

问题

【问题讨论】:

  • 您尚未提供用于构造 BooleanQuery 的代码。你需要这样做才能让别人发现它的问题。不过,我确实想知道:这场比赛的最终目的是什么?在我看来它没有任何用处...
  • 在构造 BooleanQuery 时是否可能使用了不同的分析器?我建议你在调试模式下检查解析器构造的查询,看看生成的结构是什么(从 toString() 开始)
  • @femtoRgon:谢谢,我添加了 BooleanQuery 的代码,我想我找到了导致不同结果的查询部分。由于这是遗留代码,我只想将查询更改为“如果该字段在文档本身中,则不接受带有 MUST_NOT 的文档”,所以我认为如果 MUST_NOT @987654329 存在 MatchAllQuery : @ 是唯一的单一标准。但我会检查它是否有意义。 @Yossi Vainshtein:谢谢,但 Analyzer 对他们来说是一样的:StandardAnalyzer(Version.LUCENE_46)

标签: java lucene


【解决方案1】:

我找到了解决问题的方法。 而不是为 BooleanQuery 创建这个:

Query fieldOccursQuery = new TermQuery(new Term(queryFieldName, "[* TO *]"));

我用过这个:

ConstantScoreQuery constantScoreQuery = new ConstantScoreQuery(new FieldValueFilter(queryFieldName));
    query.add(constantScoreQuery, Occur.MUST);

现在我的查询看起来不同了,但我只得到带有我的 queryFieldName 字段的文档。

问题似乎是我第一个解决方案中的主要通配符: Find all Lucene documents having a certain field

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多