2014-04-22 116 views
1

我在查找一些有关我的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在哪里生成?

应该指出的一切工作正常适合我当我搜索一个术语与IE IE手套或出了通配符只是两者的组合似乎打破查询。

回答

2

这可能是因为您的索引中没有匹配“手套*”的术语。

MultiTermQuery被重写时,它会找到合适的术语,并根据这些术语创建原始查询(如TermQuery)。如果找不到合适的术语,则会看到生成的空查询,而不像您所显示的那样。

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

另一块是分析。您对gloves的查询正在分析到gloveEnglishAnalyzer也许?)。 MultiTermQueries(如通配符,模糊,正则表达式和前缀查询)是未分析QueryParser。您的前缀查询正在尝试查找“”手套“,但是所有这些复数s已被阻止,因此它找不到任何匹配项。

+0

我有一个索引,我认为应该匹配它 - ***使用450070 ***手套一次性乳胶低粉中385057 - 我使用的是EnglishAnalyser是作为snowballAnalyser的一部分。是否应该创建一段代码,预先执行我的搜索,然后添加通配符? – Spaceman

+0

Pre-stemming prefix queries would这是一种可能性,当然,思考它,但是,分析和设置通配符查询词意味着什么意思lucene绕过分析器的通配符的一个(也许是* *)原因是,对于什么来说,有什么含糊不清的分析通配符实际上意味着 – femtoRgon

+0

足够公平,我将继续思考我将采取的行动方式。 – Spaceman