【问题标题】:Azure Search filter on the whole field整个字段的 Azure 搜索筛选器
【发布时间】:2019-10-10 06:57:05
【问题描述】:

我一直在尝试创建一个匹配整个字段文本结尾的过滤器。 例如,获取带有文本的文本字段:the brown fox jumped over the lazy dog

我希望它与搜索值以 g 结尾的字段的查询相匹配。比如:

{
  "search":"*",
  "queryType":"full",
  "searchMode": "any",
  ...
  "filter":"search.ismatchscoring('/g$/','MyField')"
}

结果仅是 MyField 包含由字符串中任意位置的单个 g 字符组成的单词的值的记录。

直接使用过滤器也不会产生任何结果:

{
  "search":"*",
  "queryType":"full",
  "searchMode": "any",
  ...
  "filter":"MyField eq '*g'"
}

据我所知,标记化将始终是搜索和过滤的基础,这意味着在上述查询中,$ 被完全忽略,匹配将按单词进行,而不是按字段。

也许我可以在这个字段上使用keyword_v2 分析器,但我会丢失我在正常搜索时使用的标记化。

【问题讨论】:

    标签: azure azure-cognitive-search


    【解决方案1】:

    一种可能的解决方案是在索引中定义第二个字段,其值与“MyField”相同,但使用不同的分析器(例如keyword_v2)。这样,您仍然可以搜索原始字段,同时过滤另一个字段。

    无论如何,您可能为了示例而简化了过滤器,但在不通过“或”与另一个过滤器子句组合时使用search.ismatchscoring() 似乎是多余的——可以直接使用search 参数。 此外,正则表达式可能不起作用,因为 search.ismatchscoring() 的默认 queryTypesimple,而不是 full - please see docs here

    【讨论】:

    • 你说得对,我们使用search.ismatchscoring(),因为我们还有其他过滤条件;我正在使用完整的查询类型。我曾想过使用keyword_v2 分析器,但是当我在同一字段上按单词搜索内容时,这也会影响其他正常搜索。使用不同的分析仪复制字段也不是那么直观的消费;查询索引的人需要知道其中的微妙之处。我了解标记化的工作原理,我只是想知道是否有办法绕过它并使用正则表达式直接查询完整的源记录。
    • 我最终选择了这个选项,因为目前没有其他方法。谢谢
    猜你喜欢
    • 2021-05-11
    • 2020-06-14
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 2021-06-01
    • 2021-09-02
    • 2022-07-05
    • 1970-01-01
    相关资源
    最近更新 更多