Lucene的通配符和带有字母的单词'最后

时间:2014-04-22 00:29:19

标签: lucene.net lucene

我在查找有关我的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*

这对我来说在多个层面上看起来很奇怪

  1. 为什么我会翻译空白条款?
  2. 为什么我混合使用TermQuery,ConstantScoreQuery和BooleanQuery?
  3. ConstantScoreQuery在哪里生成?
  4. 应该注意的是,当我搜索带有out和IE手套的术语或带有通配符时,一切正常对我来说只是两者的组合似乎打破了查询。

1 个答案:

答案 0 :(得分:2)

可能会发生这种情况,因为索引中没有与“手套*”匹配的条款。

当重写MultiTermQuery时,它会找到合适的条款,并在这些条款上创建原始查询(例如TermQuery)。如果找不到合适的术语,您将看到生成的空查询,就像您显示的那样。

TermQuery已经是一个原始查询,并且不需要重写。它不必枚举术语或任何东西,它只是运行它。

另一部分是分析。您对gloves的查询分析为glove(也许是EnglishAnalyzer)。 MultiTermQueries QueryParser(如通配符,模糊,正则表达式和前缀查询)未被s分析。您的前缀查询正在尝试查找“”手套“,但所有复数{{1}}都已被删除,因此找不到任何匹配项。