【问题标题】:Lucene wildcards and words with the letter 's' on the endLucene 通配符和以字母“s”结尾的单词
【发布时间】:2014-04-22 00:29:18
【问题描述】:

我很难找到一些关于我的 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 在哪里生成?

应该注意,当我搜索一个没有和 s IE 手套或没有通配符的术语时,一切对我来说都很好,只是两者的组合似乎会破坏查询。

【问题讨论】:

    标签: lucene.net lucene


    【解决方案1】:

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

    MultiTermQuery 被重写时,它会找到合适的术语,并根据这些术语创建原始查询(例如TermQuery)。如果没有找到合适的字词,您将看到生成的空查询,就像您显示的那样。

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

    另一部分是分析。您对gloves 的查询正在分析为glove(可能是EnglishAnalyzer?)。 MultiTermQueries(如通配符、模糊、正则表达式和前缀查询)不被QueryParser 分析。您的前缀查询试图查找“gloves”,但所有复数 s 已被删除,因此找不到任何匹配项。

    【讨论】:

    • 我有一个我认为应该匹配的索引 - USE 450070Gloves Glove Disposable Latex Low Powder Medium 385057 - 我正在使用 EnglishAnalyser 是作为雪球分析器的一部分。是否应该创建一段代码来预先阻止我的搜索,然后添加通配符?
    • 当然,预词干前缀查询是可能的。但是,请仔细考虑分析和阻止通配符查询术语的含义。 lucene 绕过通配符分析器的一个(也许是)原因是分析通配符的实际含义存在很多歧义。
    • 很公平。我将继续思考我将采取的行动方针。感谢您的洞察力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 2020-11-08
    • 2018-01-15
    • 2022-11-22
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    相关资源
    最近更新 更多