【问题标题】:Wild Card Searches in Azure Cognitive SearchAzure 认知搜索中的通配符搜索
【发布时间】:2022-01-13 08:50:35
【问题描述】:

我正在探索 ACS,看看它是否符合我们的要求。我获取了 Hotels 索引并尝试执行通配符查询,但它没有按预期工作。

例如。对于下面的文件-

        "HotelId": "24",
        "HotelName": "Gacc Capital",
        "Description": "Chic hotel near the city.  High-rise hotel in downtown, walking distance to theaters, restaurants and shops, complete with wellness programs.",
        "Description_fr": "Hôtel chic près de la ville.  Hôtel de grande hauteur dans le centre-ville, à distance de marche des théâtres, des restaurants et des magasins, avec des programmes de bien-être.",
        "Category": "Budget",
        "Tags": [
            "laundry service",
            "pool",
            "bar"
        ],
        "ParkingIncluded": false

以“Cap”作为起始词的 HotelName 搜索请求不会返回到文档上方。

$filter=search.ismatch('/.Cap.*/', 'HotelName')  

Capital 上的搜索请求在哪里返回它。

中缀搜索也是如此。

$filter=search.ismatch('/.*Cap.*/', 'HotelName')  

除此之外不返回任何内容。

$filter=search.ismatch('/.Capital.*/', 'HotelName') 

我认为这与索引中指定的语言分析器有关,但有没有办法让我的行为就像数据库的工作方式一样?

编辑

我使用示例数据创建了一个不同的索引,并将名称字段的分析器更改为使用基于 Keyword_v2 标记器和小写标记过滤器的自定义分析器,这将按原样存储字符串,如 here 所述

这适用于前缀,中缀搜索例如。

search = Cap*
search = /.*Cap.*/

但是,后缀搜索不起作用 -

search=/.*tal./

应该根据文档here工作

想知道后缀的搜索语法是否不同或者是否有其他方式来执行后缀搜索?

【问题讨论】:

    标签: azure search indexing wildcard azure-cognitive-search


    【解决方案1】:

    Cap 的搜索不应与标记 Capital 匹配。这是预期的行为。支持通配符搜索。您可以对所有可搜索的属性执行通配符查询。或者可以将其范围限定为仅在 HotelName 属性内进行搜索:

    search=HotelName:Cap*
    

    这将返回您期望的结果

    "value": [
        {
            "@search.score": 1,
            "HotelId": "24",
            "HotelName": "Gacc Capital",
            "Category": "Budget"
        },
        {
            "@search.score": 1,
            "HotelId": "34",
            "HotelName": "Cap'n Jack's Waterfront Inn",
            "Category": "Budget"
        }
    ]
    

    编辑:如果您的要求是匹配名称的开头,您可以使用:

    search=HotelName:"Cap'n*"&$count=true&queryType=full&searchMode=all&$select=HotelId,HotelName
    

    这将返回一次点击

    "@odata.count": 1,
    "value": [
        {
            "@search.score": 1.219939,
            "HotelId": "34",
            "HotelName": "Cap'n Jack's Waterfront Inn"
        }
    ]
    

    PS:在您最初的问题中,您使用正则表达式语法,但您的意图是匹配整行。文档说正则表达式与单个单词匹配。

    https://docs.microsoft.com/en-us/azure/search/query-lucene-syntax#bkmk_regex

    【讨论】:

    • 您好,感谢您的回复。在上面的示例中 Cap* 应该只返回名称以 Cap 开头的文档,这意味着它应该只返回第二个文档而不是第一个文档。有什么办法可以使这个工作类似于数据库?此外,我无法在 Azure 搜索资源管理器中使用此语法,但在 QueryType 设置为 Full 的示例应用程序中。我注意到的另一件事是,后缀搜索不适用于例如这个不工作 /.*Inn./ 应该返回第二个文档但不返回任何结果。
    • 我用一个示例更新了我的回复以匹配该字段的开头。
    • 我用我的发现更新了这个问题。正如你所说的正则表达式与单个单词匹配,所以我将字段更改为使用自定义分析器和 Keyword_v2 标记器,它不会生成任何标记,这应该符合我的目的,但它不适用于后缀搜索关于此的任何建议?
    猜你喜欢
    • 2021-03-06
    • 2020-03-27
    • 1970-01-01
    • 2022-01-24
    • 2021-11-05
    • 2020-09-01
    • 1970-01-01
    • 2021-09-21
    • 2020-07-03
    相关资源
    最近更新 更多