2016-11-07 69 views
0

有两个查询,一个是由QueryParser的创建:Lucene 6.0中的TermQuery和QueryParser有什么区别?

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

另一个是词语查询:

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

是什么QUERY1和QUERY2之间的区别?

回答

2

这是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"));` 

在这种情况下,查询将在现场为确切的词“阿帕奇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 query2 = parser.parse("title:\"Apache Lucene\""); 
` 

几件事。

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

    因此,解析器将在标题字段中搜索“Apache”并在正文字段中搜索“Lucene”。 由于现场只适用于它直接先http://lucene.apache.org/core/2_9_4/queryparsersyntax.html)一词,

    所以,因为我们不指定任何Lucene的领域,“身体”将用于这是默认的领域。

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

因此,总结一下,术语查询不会分析术语并按原样进行搜索。而查询解析器基于上述某些条件解析输入。

2

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

TermQuery不做分析,并且按原样使用该术语。这是主要的区别。

所以query1query2可能我当量(从某种意义上说,他们提供相同的搜索结果),如果field是一样的,和的QueryParser的analyzer没有改变术语。