- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我目前不确定 Lucene 中 QueryParser 与 TermQuery 的行为;我正在使用 Lucene 3.6。
在我的示例中,我在同一索引上尝试以下示例,其中相关字段设置为 Field.Store.NO
和 Field.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\"");
在 q2
和 q3
这两种情况下,我都无法重现与 q1
相同的语法;通过打印查询,我可以看到:
names:test three
names:test names:three
names:"测试三"
由于这种差异,查询 q2
和 q3
不返回结果,而查询 q1
返回预期结果。
问题:有没有办法让查询解析器重现与 TermQuery 相同的查询,或者我是否遗漏了一些基本的 Lucene 概念?
注意:对于 QueryParser,分析器与索引期间使用的分析器相同,但我不确定此信息的相关性。
最佳答案
使用您的TermQuery
,您将生成一个术语测试三个
。由于未分析该字段,因此生成单个术语是正确的。
在第 2 季度,由于查询解析器的语法,您会看到两个单独的术语。真正在做的是与类似的查询相匹配; names:test defaultField:three
,虽然它并不明显,因为您的默认字段也是“names”
在第 3 季度(您注意到的地方确实非常相关!),您生成了一个短语查询,它与您在第 1 季度中提供的 TermQuery
不太一样,但是正确的分析器,它可以等效。 PhraseQueries 被分析,我猜查询解析器使用的分析器有 StandardAnalyzer
,或类似的东西。区别在于术语的外观:
test
- three
测试三
因此,在这两种表示之间没有可匹配的相同术语。相反,请尝试使用 KeywordAnalyzer
,这实际上与使用未分析的字段相同。
您通常希望确保在 QueryParser
中使用与分析文档相同的分析器,其中 KeywordAnalyzer
实际上是一个等价的分析器未分析字段。
关于java - Lucene QueryParser 与 TermQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22100626/
当我尝试在 Lucene 中搜索诸如“解决方法/修复”之类的内容时,它会抛出此错误: org.apache.lucene.queryparser.classic.ParseException: Can
我正在尝试搜索几个字段,除非我使用术语“BE”,否则它工作正常。在这种情况下,lucene 会简单地忽略该字段。如果我执行如下所示的操作,我会得到正确的结果,并且“查询”对象显示为“+flag:bf
我目前正在使用 QueryParser 搜索方法,但我不想给最终用户太多的控制权。 所以目前如果他们正在寻找这样的作品: The* 我将其传递到 QueryParser.parse() 方法中。 现在
我正在使用 Lucene++ 3.0.3 处理前队友的代码。 有一条评论声称 QueryParser 无法处理“特殊字符”,一种处理方法是用空格替换“特殊字符”: if (((*pos) >= L'A
我正在使用 whoosh 包进行全文模糊匹配。 我当前的代码如下: from whoosh.index import create_in from whoosh.fields import * fro
我是 Lucene 的新手,并试图将原始字符串解析为 Query使用 QueryParser . 我想知道,为什么 QueryParser.Parse()方法需要一个 Analyzer 参数吗? 如果
我正在使用 Lucene.net,但我为 .NET 和 Java 版本都标记了这个问题,因为 API 是相同的,我希望这两个平台上都有解决方案。 我确信其他人已经解决了这个问题,但我还没有找到任何好的
我有一个查询 -license:"CC-BY-NC"AND -license:"CC-BY-ND 4.0 (Int)" 将像这样传递到 PrecedenceQueryParser.parse 中: Q
我读到How to incorporate multiple fields in QueryParser?但我没明白。 目前我有一个非常奇怪的结构,例如: parser = New QueryPars
我有一个查询 -license:"CC-BY-NC"AND -license:"CC-BY-ND 4.0 (Int)" 将像这样传递到 PrecedenceQueryParser.parse 中: Q
我有 2 个 lucene 查询: 1) Term term = new Term(Properties.LUCENE_APPARTMENT_ADDRESS,address); Query termQ
我通过 QueryParser 创建查询: QueryParser parser = new QueryParser(Version.LUCENE_30, "Text", new RussianAna
我正在研究 Lucene,无法区分 QueryParser 和 Term Query。看来他们是一样的。这是真的?如果不是,我应该什么时候使用一个而不是另一个? 最佳答案 不,它们不一样。以下是对它们
我目前不确定 Lucene 中 QueryParser 与 TermQuery 的行为;我正在使用 Lucene 3.6。 在我的示例中,我在同一索引上尝试以下示例,其中相关字段设置为 Field.S
在第 3 行,我收到异常,例如“IOException:读取过去的 eof”和“LookaheadSuccess:应用程序中的错误”。 有什么办法可以避免这种情况吗?我讨厌每次执行搜索时中断并按两次继
我正在使用以下代码(准确地说是 PyLucene)调用 Lucene: analyzer = StandardAnalyzer(Version.LUCENE_30) queryparser = Que
我在我的项目中遇到了以下错误: org.apache.lucene.queryParser.ParseException:无法解析“AMERICAN EXP PROPTY CASLTY INS AND
new QueryParser(.... ).parse (somequery); 它仅适用于字符串索引字段。假设我有一个名为 count 的字段,其中 count 是一个整数字段(在索引字段时我考虑
事情就是这样。我有一个存储在索引中的词,其中包含特殊字符,例如'-',最简单的代码是这样的: Document doc = new Document(); doc.add(new TextField(
这最近一直困扰着我,我似乎无法在任何地方找到合适的解释。 如果我运行一个使用 Query API 构建的查询,它运行得非常好。 TermQuery sourceQuery = new TermQuer
我是一名优秀的程序员,十分优秀!