【问题标题】:Phrase query on not analyzed field not working未分析字段的短语查询不起作用
【发布时间】:2019-01-05 09:22:08
【问题描述】:

我有一个带有“productOptions”字段的产品搜索索引,其中包含序列化的 JSON,这意味着它可能包含没有选项的产品的空数组,或者包含产品选项的产品选项的数组:

  • []
  • [{ optionId: "", ... }]

当我在 Luke 中尝试查询 +productOptions: "[]"(使用 StandardAnalyzer)时,我没有得到任何匹配项。我的印象是,只要有完全匹配,StandardAnalyzer 就会搜索未分析的字段 - 所以我不明白为什么我没有得到任何点击。但是,如果我切换到 KeywordAnalyzer,我确实会获得点击,但不能使用 KeywordAnalyzer,因为我正在查询产品选项作为需要 StandardAnalyzer 的更复杂搜索查询的一部分。

如何编写一个查询来查找所有没有选项的产品(即 productOptions == [])?

注意:我无法控制索引过程,因此无法控制被索引的值。

【问题讨论】:

  • 好吧,你无法控制索引,但是你了解索引时使用什么样的分析器吗?
  • @Mysterion 因为整个索引过程发生在第三方插件中,该插件又使用 Umbraco 检查我不能 100% 确定,但从我在源代码中看到的应该是标准分析器。

标签: lucene luke


【解决方案1】:

这里的问题如下,StandardAnalyzer 有效地删除了[] 并只留下空字符串。

这使得稍后搜索相同的字符串[] - 找不到任何东西。

找到那些“空”字符串的一种可能性是搜索-field_name:[* TO *],这意味着:

field_name:[* TO *] 是一种 hacky 解决方法,用于搜索在该字段中包含任何内容但为空的任何文档,- 有效地否定了此条件并最终要求在 field_name 中包含空数据的所有文档

【讨论】:

  • 嗯,我明白你的意思,但是这在 Luke 中根本没有返回任何命中...当我查看 Luke 中的文档时,我可以看到它仍然具有值 []。 StandardAnalyzer 是否在索引或查询时删除 []?
  • Luke 只能显示存储值(即原始值,未分析)
猜你喜欢
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 2015-01-19
相关资源
最近更新 更多