Lucene 6.0中的TermQuery和QueryParser有什么区别?
有两个查询,一个是由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之间的区别?
这是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\"");
`
几件事。
- “title”是QueryParser将搜索的字段,如果不用字段作为前缀(如构造函数中给出的那样)。
- parser.parse(“title:Apache body:Lucene”); - >在这种情况下,最终查询将如下所示。 query2 = title:Apache正文:Lucene。
-
parser.parse(“title:Apache Lucene”); - >在这种情况下,最终查询也将如下所示。 query2 = title:Apache正文:Lucene。但出于不同的原因。
因此,解析器将在标题字段中搜索“Apache”并在正文字段中搜索“Lucene”。 由于现场只适用于它直接先(http://lucene.apache.org/core/2_9_4/queryparsersyntax.html)一词,
所以,因为我们不指定任何Lucene的领域,“身体”将用于这是默认的领域。
query2 = parser.parse(“title:\”Apache Lucene \“”);在这种情况下,我们明确告诉我们要在字段“标题”中搜索“Apache Lucene”。这是词组查询,如果分析正确,则与词语查询类似。
因此,总结一下,术语查询不会分析术语并按原样进行搜索。而查询解析器基于上述某些条件解析输入。
QueryParser
解析字符串并构造一个由BooleanClauses
和analyzes
组成的BooleanQuery
(afaik)。
TermQuery
不做分析,并且按原样使用该术语。这是主要的区别。
所以query1
和query2
可能我当量(从某种意义上说,他们提供相同的搜索结果),如果field
是一样的,和的QueryParser的analyzer
没有改变术语。