【问题标题】:How to combine search string and filter using OR logic in Azure Search or use filter logic in the query string?如何在 Azure 搜索中使用 OR 逻辑组合搜索字符串和筛选器,或在查询字符串中使用筛选器逻辑?
【发布时间】:2021-07-23 01:44:55
【问题描述】:

我有一个索引,我需要使用 OR 逻辑将搜索字符串与过滤器字符串组合在一起 - 因此,它将返回搜索字符串的所有匹配项以及过滤器的所有匹配项

例如,我有一个带有可选描述和可选墙壁颜色为整数的房间复杂类型属性。

如何编写在查询和过滤器之间使用 OR 逻辑的查询?

所以,当 1 和 2 代表黑色和深蓝色时,它会是这样的

{
    "search": "room/description: (\"dark walls\")",
    "queryType": "full",
    "filter": "room/wallColour eq 1 or room/wallColour eq 2 or room/wallColour eq null",
    "top": 10
}

但搜索和过滤之间存在 OR。

或者,对于 .NET sdk 调用(过滤器和查询之间使用 OR 逻辑):

var options = new SearchOptions()
{ 
  Size = pageSize,
  QueryType = SearchQueryType.Full,
  Filter = filter
};
await searchClient.SearchAsync<Room>(query, options);

如果可以将特定于 int 和特定于 null 的部分从过滤器移动到搜索,我也不介意这样做,只是不知道如何。

我不想将 int 字段转换为字符串以便能够搜索,因为我无法控制索引结构。

我使用 .net 核心 SDK 进行搜索,但最初通过调用 POST 到 search.windows.net/indexes 来调试查询,因此,展示如何以任何一种方式进行都会对我有所帮助。

【问题讨论】:

    标签: azure-cognitive-search azure-cognitive-services azure-search-.net-sdk


    【解决方案1】:

    您可以使用search.ismatchsearch.ismatchscoring 在过滤器表达式中引入搜索。更多细节在这里: https://docs.microsoft.com/en-us/azure/search/search-query-odata-full-text-search-functions

    按照您的示例,您可以将组合过滤器/搜索编写为:

    search.ismatchscoring('room/description: ("dark walls")', null, 'full', 'any') or room/wallColour eq 1 or room/wallColour eq 2 or room/wallColour eq null

    【讨论】:

    • 好的,感谢您的快速回复!它对我有用。令人惊讶的是,我不需要过滤房间/描述 - 这是一个真正的好处!
    • 很高兴它成功了。 search.ismatch() 和 search.ismatchscoring() 依赖于可搜索的字段(就像顶级搜索一样),它们不需要该字段是可过滤的。
    猜你喜欢
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 2021-03-06
    • 2020-06-14
    • 2017-06-27
    相关资源
    最近更新 更多