gpt4 book ai didi

lucene.net - TermQuery 不会返回已知的搜索词,但 WildcardQuery 会返回

转载 作者:行者123 更新时间:2023-12-04 11:42:27 26 4
gpt4 key购买 nike

我希望对 Lucene 内部工作有足够洞察力的人能够为我指明正确的方向 =)

我将跳过大部分与周围无关的代码,直接切入正题。我有一个 Lucene 索引,我将以下字段添加到索引中(变量替换为其文字值):

document.Add( new Field("Typenummer", "E5CEB501A244410EB1FFC4761F79E7B7", 
Field.Store.YES , Field.Index.UN_TOKENIZED));

后来,当我搜索我的索引(使用其他类型的查询)时,我能够验证这个字段确实出现在我的索引中 - 就像循环遍历 Document.GetFields() 返回的所有字段一样
Field: Typenummer, Value: E5CEB501A244410EB1FFC4761F79E7B7

到现在为止还挺好 :-)

现在真正的问题是 - 为什么我不能使用 TermQuery 来搜索这个值并实际得到结果。

此代码产生 0 个命中:
// Returns 0 hits
bq.Add( new TermQuery( new Term( "Typenummer",
"E5CEB501A244410EB1FFC4761F79E7B7" ) ), BooleanClause.Occur.MUST );

但是如果我将它切换到 WildcardQuery(没有通配符),我会得到我期望的 1 个命中。
// returns the 1 hit I expect
bq.Add( new WildcardQuery( new Term( "Typenummer",
"E5CEB501A244410EB1FFC4761F79E7B7" ) ), BooleanClause.Occur.MUST );

我已经检查了字段长度,我已经检查过我使用的是相同的分析器等等,我仍然在第 1 方格中,为什么会这样。

任何人都可以指出我应该寻找的方向吗?

最佳答案

我终于明白是怎么回事了。我正在扩展这个问题的标签,出乎我的意料,结果实际上是存在这个特定问题的 CMS 的问题。总而言之,问题归结为:

  • 该字段存储为 UN_TOKENIZED,这意味着 Lucene 将“按原样”存储它
  • 我粘贴的 BooleanQuery 片段被发送到 PreparedQuery 包装器内的 Sitecore SearchManager
  • 我期望的行为是,我的查询(已经准备好)将 - 不变 - 转到 Lucene API
  • 原来我错了。它通过 RewriteQuery 方法按原样复制我的整个嵌套查询集,只有一个异常(exception) - 所有 Term 参数都通过 LowercaseStrategy()
  • 传递。
  • 当我索引一个大写术语 (UN_TOKENIZED) 时,Sitecore 将我的 PreparedQuery 更改为小写 - 返回 0 个结果

  • 我不会开始争论这是 Lucene Wrapper API 的“按设计”还是“按设计缺陷”实现 - 我只是注意到,在使用 PreparedQuery 重载时重写我的查询是......对我来说.. . 出乎意料 ;-)

    进一步的教导;将该字段存储为 TOKENIZED 也将消除此问题,因为 StandardAnalyzer 默认情况下会将所有标记小写。

    关于lucene.net - TermQuery 不会返回已知的搜索词,但 WildcardQuery 会返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9431114/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com