gpt4 book ai didi

java - Lucene QueryParser 与 TermQuery

转载 作者:搜寻专家 更新时间:2023-11-01 03:38:27 25 4
gpt4 key购买 nike

我目前不确定 Lucene 中 QueryParser 与 TermQuery 的行为;我正在使用 Lucene 3.6。

在我的示例中,我在同一索引上尝试以下示例,其中相关字段设置为 Field.Store.NOField.Index.NOT_ANALYZED_NO_NORMS.

Query q1 = new TermQuery(new Term("names", "test three"));

QueryParser q2p = new QueryParser(GenericIndexer.LUCENE_VERSION, "names", someAnalyzer);
Query q2 = q2p.parse("names:test three");
Query q3 = q2p.parse("names:\"test three\"");

q2q3 这两种情况下,我都无法重现与 q1 相同的语法;通过打印查询,我可以看到:

  • q1 = names:test three
  • q2 = names:test names:three
  • q3 = names:"测试三"

由于这种差异,查询 q2q3 不返回结果,而查询 q1 返回预期结果。

问题:有没有办法让查询解析器重现与 TermQuery 相同的查询,或者我是否遗漏了一些基本的 Lucene 概念?

注意:对于 QueryParser,分析器与索引期间使用的分析器相同,但我不确定此信息的相关性。

最佳答案

使用您的TermQuery,您将生成一个术语测试三个。由于未分析该字段,因此生成单个术语是正确的。

在第 2 季度,由于查询解析器的语法,您会看到两个单独的术语。真正在做的是与类似的查询相匹配; names:test defaultField:three,虽然它并不明显,因为您的默认字段也是“names”

在第 3 季度(您注意到的地方确实非常相关!),您生成了一个短语查询,它与您在第 1 季度中提供的 TermQuery 不太一样,但是正确的分析器,它可以等效。 PhraseQueries 被分析,我猜查询解析器使用的分析器有 StandardAnalyzer,或类似的东西。区别在于术语的外观:

  • StandardAnalyzer 分析的术语:test - three
  • 未分析领域的术语:测试三

因此,在这两种表示之间没有可匹配的相同术语。相反,请尝试使用 KeywordAnalyzer ,这实际上与使用未分析的字段相同。

您通常希望确保在 QueryParser 中使用与分析文档相同的分析器,其中 KeywordAnalyzer 实际上是一个等价的分析器未分析字段。

关于java - Lucene QueryParser 与 TermQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22100626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com