【问题标题】:what is the difference between TermQuery and QueryParser in Lucene 6.0?Lucene 6.0 中的 TermQuery 和 QueryParser 有什么区别?
【发布时间】:2022-01-05 04:37:45
【问题描述】:

有两个查询,一个是由 QueryParser 创建的:

QueryParser parser = new QueryParser(field, analyzer);
Query query1 = parser.parse("Lucene");

另一个是词条查询:

Query query2=new TermQuery(new Term("title", "Lucene"));

query1 和 query2 有什么区别?

【问题讨论】:

    标签: lucene


    【解决方案1】:

    这是 Lucene 文档中 Term 的定义。

    A Term represents a word from text. This is the unit of search. It is composed of two elements, the text of the word, as a string, and the name of the field that the text occurred in.
    

    因此,在您的情况下,将创建查询以在“title”字段中搜索“Lucene”一词。

    为了解释两者之间的区别,让我举一个不同的例子,

    考虑以下

    Query query2 = new TermQuery(new Term("title", "Apache Lucene"));
    

    在这种情况下,查询将在字段标题中搜索确切的单词“Apache Lucene”。

    在其他情况下 例如,假设一个 Lucene 索引包含两个字段,“title”和“body”。

    QueryParser parser = new QueryParser("title", "StandardAnalyzer");
    Query query1 = parser.parse("title:Apache body:Lucene");
    Query query2 = parser.parse("title:Apache Lucene");
    Query query3 = parser.parse("title:\"Apache Lucene\"");
    

    几件事。

    1. “title”是 QueryParser 将搜索的字段,如果您不使用字段作为前缀。(在构造函数中给出)。
    2. parser.parse("title:Apache body:Lucene"); -> 在这种情况下,最终查询将如下所示。 query2 = 标题:Apache 正文:Lucene。
    3. parser.parse("body:Apache Lucene"); -> 在这种情况下,最终查询也将如下所示。 query2 = 正文:Apache 标题:Lucene。但出于不同的原因。

      因此解析器将在正文字段中搜索“Apache”,在标题字段中搜索“Lucene”。 由于该字段仅对其直接前面的字词有效,(http://lucene.apache.org/core/2_9_4/queryparsersyntax.html)

      因此,由于我们没有为 lucene 指定任何字段,因此将使用默认字段“title”。

    4. query2 = parser.parse("title:\"Apache Lucene\""); 在这种情况下,我们明确告诉我们要在“title”字段中搜索“Apache Lucene”。这是短语查询,如果分析正确,类似于 Term 查询。

    所以总结术语查询不会分析术语并按原样搜索。而查询解析器根据上述某些条件解析输入。

    【讨论】:

    • "因此,由于我们没有为 lucene 指定任何字段,因此将使用默认字段“body”。"默认字段不应该是“标题”吗?正如您在 #1 中提到的,由于第一个参数传递给 QueryParser 的构造函数?
    • 你是对的。那是一个错字。我纠正了它。感谢您指出。
    【解决方案2】:

    QueryParser 解析字符串并构造一个由BooleanClausesanalyzes 沿途术语组成的BooleanQuery (afaik)。

    TermQuery 不进行分析,并按原样使用术语。这是主要区别。

    所以query1query2 可能是等价的(从某种意义上说,它们提供相同的搜索结果)如果field 相同,并且QueryParser 的analyzer 没有改变术语。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 2017-04-03
      • 1970-01-01
      • 2011-03-05
      相关资源
      最近更新 更多