我在查找有关我的lucene搜索时发生的一些信息时遇到了一些麻烦。
(Id:gloves* Search:gloves* SpellCheckerSource:gloves*) OR
(Id:gloves Search:gloves SpellCheckerSource:gloves) OR
(Id:glove* Search:glove* SpellCheckerSource:glove*)
当我搜索上述内容时,我会得到以下重写的术语
(() () ())
(Id:glove Search:glove SpellCheckerSource:glove)
(() ConstantScore(Search:glove*) ConstantScore(SpellCheckerSource:glove*))
这是使用LUKE,我一直在LUKE中运行查询以尝试查看最新情况。 http://www.getopt.org/luke/
现在我想要做的是搜索一个术语,即手套*最终成为(()()())
我不明白为什么会这样翻译,因为我的查询或我的索引存在问题?
LUKE告诉我结构说明如下
lucene.BooleanQuery
clauses=3, maxClauses=1024
Clause 0: SHOULD
lucene.BooleanQuery
clauses=3, maxClauses=1024
Clause 0: SHOULD
lucene.BooleanQuery
clauses=0, maxClauses=1024, coord=false
Clause 1: SHOULD
lucene.BooleanQuery
clauses=0, maxClauses=1024, coord=false
Clause 2: SHOULD
lucene.BooleanQuery
clauses=0, maxClauses=1024, coord=false
Clause 1: SHOULD
lucene.BooleanQuery
clauses=3, maxClauses=1024
Clause 0: SHOULD
lucene.TermQuery
Term: field='Id' text='glove'
Clause 1: SHOULD
lucene.TermQuery
Term: field='Search' text='glove'
Clause 2: SHOULD
lucene.TermQuery
Term: field='SpellCheckerSource' text='glove'
Clause 2: SHOULD
lucene.BooleanQuery
clauses=3, maxClauses=1024
Clause 0: SHOULD
lucene.BooleanQuery
clauses=0, maxClauses=1024, coord=false
Clause 1: SHOULD
lucene.ConstantScoreQuery, ConstantScore(Search:glove*)
Filter: Search:glove*
Clause 2: SHOULD
lucene.ConstantScoreQuery, ConstantScore(SpellCheckerSource:glove*)
Filter: SpellCheckerSource:glove*
这对我来说在多个层面上看起来很奇怪
应该注意的是,当我搜索带有out和IE手套的术语或带有通配符时,一切正常对我来说只是两者的组合似乎打破了查询。
答案 0 :(得分:2)
可能会发生这种情况,因为索引中没有与“手套*”匹配的条款。
当重写MultiTermQuery
时,它会找到合适的条款,并在这些条款上创建原始查询(例如TermQuery
)。如果找不到合适的术语,您将看到生成的空查询,就像您显示的那样。
TermQuery已经是一个原始查询,并且不需要重写。它不必枚举术语或任何东西,它只是运行它。
另一部分是分析。您对gloves
的查询分析为glove
(也许是EnglishAnalyzer
)。 MultiTermQueries
QueryParser
(如通配符,模糊,正则表达式和前缀查询)未被s
分析。您的前缀查询正在尝试查找“”手套“,但所有复数{{1}}都已被删除,因此找不到任何匹配项。