我可以在 Azure 认知搜索中使用可选筛选器吗

Can I use optional filters in Azure Cognitive Search

我想实现这样的搜索逻辑“给我索引中与我的词匹配的所有文章,并优先选择某个类别的文章”。

在弹性搜索中,可以使用“应该”布尔查询来实现:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

should The clause (query) should appear in the matching document.

但我不确定如何在 Azure 认知搜索中实现它。一种选择是搜索所有不属于该类别的文章,然后搜索所有属于该类别的文章,并根据评分进行某种全局排序。

是否有内置功能?

您应该能够通过使用允许在过滤器表达式中编写全文搜索的 search.ismatchscoring 来实现所需的行为。

此过滤器表达式将确保 skateboardsTitle 中并在 Category 中搜索 sports 以有助于评分,但它仍然会 return 其他类别的文​​档由于 or 语句:

search.ismatchscoring('skateboards', 'Title') and (search.ismatchscoring('sports', 'Category') or search.ismatchscoring('*'))

通过 Azure 搜索中名为 Term Boosting 的功能支持您的要求。在您的示例中,您有一些必须存在的搜索词。但是,您实际上并不知道这些术语是否在您想到的类别中。如果他们这样做,您想将它们提升到顶部。

  • 您的搜索字词是一个过滤器,用于确定是否应包含一篇文章。
  • 您要求的类别是首选。

用例

假设您有一个音乐索引。您使用以下索引规范(例如已简化)。

{
"fields": [

    {"name": "Id", "type": "Edm.String", "searchable": false, "filterable": true, "retrievable": true, "sortable": true, "facetable": false, "key": true, "indexAnalyzer": null, "searchAnalyzer": null, "analyzer": null, "synonymMaps": [] }, 
    {"name": "Title", "type": "Edm.String", "searchable": true, "filterable": true}, 
    {"name": "Genre", "type": "Edm.String", "searchable": true, "filterable": true},
    {"name": "Artist", "type": "Edm.String", "searchable": true, "filterable": true}
], 

}

索引包含以下项目。

{
    "value": [
    {
        "@search.action": "mergeOrUpload",
        "Id": "1",
        "Title": "We will rock you",
        "Genre": "Classical",
        "Artist": "London Symphony"
    },
    {
        "@search.action": "mergeOrUpload",
        "Id": "2",
        "Title": "We will rock you",
        "Genre": "Rock",
        "Artist": "Queen"
    },
    {
        "@search.action": "mergeOrUpload",
        "Id": "3",
        "Title": "Bohemian Rhapsody",
        "Genre": "Rock",
        "Artist": "Queen"
    }
]

}

现在,假设您正在寻找歌曲 we will rock you。如果您只是搜索这些术语,您会得到两次匹配。请注意,类型为 Rock 的项目得分更高。这是因为您的搜索词 rock 的词频。摇滚既出现在流派中,也出现在标题中。

{
        "@odata.count": 2,
        "value": [
        {
            "@search.score": 1.4384104,
            "Id": "2",
            "Title": "We will rock you",
            "Genre": "Rock",
            "Artist": "Queen"
        },
        {
            "@search.score": 1.1507283,
            "Id": "1",
            "Title": "We will rock you",
            "Genre": "Classical",
            "Artist": "London Symphony"
        }
    ]
}

在您的情况下,您更喜欢来自特定类别的内容。翻译成这个例子,假设你真的更喜欢古典类型的热门歌曲。您可以像这样使用过滤器构建查询。

我们会震撼你流派:“古典”

由于您正在过滤,因此您只会获得 1 次匹配。请注意,分数现在也更高了。

{
"@odata.count": 1,
"value": [
    {
        "@search.score": 1.4384104,
        "Id": "1",
        "Title": "We will rock you",
        "Genre": "Classical",
        "Artist": "London Symphony"
    }
]}

如果您应用提升,比如提升 10 倍,您会看到分数增加。例如

我们会摇滚你流派:“古典”^10

{
"@odata.count": 1,
"value": [
    {
        "@search.score": 4.0275493,
        "Id": "1",
        "Title": "We will rock you",
        "Genre": "Classical",
        "Artist": "London Symphony"
    }
]}

但是,假设您不知道是否有不同类型的多个版本。你想要的是'we will rock you'的所有版本,但如果有来自古典类型的热门,那就是你喜欢的。这是一个不同的问题(以及你在问我的解释是否正确)。

(we will rock you) OR (we will rock you Genre:"Classical"^10)

这会产生 2 个结果,经典版本在最上面。

    "@odata.count": 2,
"value": [
    {
        "@search.score": 5.1782775,
        "Id": "1",
        "Title": "We will rock you",
        "Genre": "Classical",
        "Artist": "London Symphony"
    },
    {
        "@search.score": 1.4384104,
        "Id": "2",
        "Title": "We will rock you",
        "Genre": "Rock",
        "Artist": "Queen"
    }
]