【问题标题】:TermQuery not returning on a known search term, but WildcardQuery doesTermQuery 未返回已知搜索词,但 WildcardQuery 确实
【发布时间】:2012-02-24 12:53:07
【问题描述】:

希望对 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 格,为什么会这样。

谁能指出我应该寻找的方向?

【问题讨论】:

  • 我对 Lucene.net 不是很熟悉,但是如果它使用与 java 版本相同的索引结构,您可以使用 Luke code.google.com/p/luke 来检查您的索引结构是否符合您的期望。或者,您能否检查一下 TermsIndex#seekExact 是否设法找到您的术语?

标签: lucene.net sitecore sitecore6 lucene


【解决方案1】:

我终于弄清楚发生了什么。我正在扩展这个问题的标签,因为令我惊讶的是,实际上这个问题存在于 CMS 中。总而言之,问题归结为:

  1. 该字段存储为 UN_TOKENIZED,这意味着 Lucene 将完全“按原样”存储它
  2. 我粘贴 sn-ps 的 BooleanQuery 被发送到 PreparedQuery 包装器内的 Sitecore SearchManager
  3. 我对此的预期行为是,我的查询(已经准备好)将原封不动地转到 Lucene API
  4. 原来我错了。它通过一个 RewriteQuery 方法,该方法按原样复制我的整个嵌套查询集,但有一个例外 - 所有 Term 参数都通过 LowercaseStrategy() 传递
  5. 当我为大写术语 (UN_TOKENIZED) 编制索引时,Sitecore 将我的 PreparedQuery 更改为小写 - 返回 0 个结果

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

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

【讨论】:

  • 刚刚遇到了与 Lucene.NET 类似的问题。这篇文章为我节省了时间,谢谢。
  • @mark Cassidy 哇。你是唯一一个讨论这个问题的人。我有类似的问题。我试图在将值传递给搜索之前对其进行过滤。过滤器 filter = new QueryWrapperFilter(new WildcardQuery(new Term(field1, "005NWVOXDYN3U0V6")));.文本值在该过滤器中不起作用。但是,这些数字正在发挥作用。我什至尝试了 TermQuery,但结果相同。你能帮我解决这个问题吗?
  • 我实现了一个自定义关键字分析器。它和内置的关键字分析器一样,除了我也通过内置的小写过滤器传递“令牌”。这意味着我将几乎所有字段都通过标记器传递(即使大多数只是“按原样”传递),但它允许在所有字段上进行不区分大小写的匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 2020-06-22
  • 2021-10-14
  • 2020-05-20
相关资源
最近更新 更多