【问题标题】:Can I use optional filters in Azure Cognitive Search我可以在 Azure 认知搜索中使用可选筛选器吗
【发布时间】:2023-04-09 14:36:01
【问题描述】:

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

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

should 子句(查询)应该出现在匹配的文档中。

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

有内置功能吗?

【问题讨论】:

    标签: azure-cognitive-search


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。这可能有效,但尚不清楚该类别是真正首选还是基本上只是两个查询。
    【解决方案2】:

    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"
        }
    ]
    

    }

    现在,假设您正在寻找歌曲我们会摇滚你。如果您只是搜索这些术语,您将获得两次点击。请注意,类型为 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"
        }
    ]
    

    【讨论】:

    • 这对我不起作用。因为不再需要该术语。它还将为我提供该类别的其他结果。
    猜你喜欢
    • 2021-03-06
    • 2020-12-14
    • 1970-01-01
    • 2021-12-24
    • 2021-06-06
    • 2020-06-14
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多