【问题标题】:Azure cognitive search wildcard filterAzure 认知搜索通配符筛选器
【发布时间】:2021-03-06 10:16:04
【问题描述】:

我有一个名为“ArticleNames”的复杂类型的 Azure 搜索索引。这有两个子字段:firstName 和 lastName。我正在尝试在这些字段中创建通配符查询,但在获取语法正确时遇到了问题。如果我寻找一个完全匹配,事情工作正常如下:

        string facetFilter = " ArticleNames/any(person: person/lastName eq 'Trudeau')";
        var options = new SearchOptions()
        {
            Filter = facetFilter,
            Size = 10,
            IncludeTotalCount = true,
            SearchMode = SearchMode.All,
            Skip = start,
            QueryType = SearchQueryType.Full
        };
        SearchResults<SearchDocument> response = searchClient.Search<SearchDocument>("*", options)

如果我只传入“Tru”,我该如何修改它以便能够同时获得 Trudea 和 Truman 的结果?

Tks

【问题讨论】:

    标签: c# azure-cognitive-search


    【解决方案1】:

    对于部分匹配,您需要使用全文搜索,而不是过滤器。假设ArticleNames/lastNamesearchable,您应该可以使用这样的前缀查询:

    var options = new SearchOptions()
    {
        Size = 10,
        IncludeTotalCount = true,
        SearchMode = SearchMode.All,
        Skip = start,
        QueryType = SearchQueryType.Full
    };
    SearchResults<SearchDocument> response = searchClient.Search<SearchDocument>("ArticleNames/lastName:Tru*", options);
    

    虽然不在您的示例中,但您在问题中提到您希望能够查询 across firstNamelastName。我假设这意味着您希望能够匹配任何文档,例如,对于给定的文章,至少有一篇文章名称firstName 以“Jo”开头并且lastName 以“Sm”开头。您应该知道,除非您使用严格的过滤,否则今天这是不可能的(例如,firstName 完全等于“John”,lastName 等于“Smith”)。跨复杂集合的全文搜索查询仅支持“不相关”语义,如this article 中所述。

    例如,如果您执行了这个搜索查询:

    search=ArticleNames/firstName:Jo* AND ArticleNames/lastName:Sm*
    

    AND 指的是整个文档,而不是 ArticleNames 字段的给定元素,因此它会匹配名称为“Jonathan Brown”和“Alice Smart”的文档,即使您的意图只是匹配类似“Jonathan Smart”。

    如果这种情况对您很重要,请在this User Voice item 上投票,以帮助我们确定优先级。

    【讨论】:

    • 嗨布鲁斯。感谢您提供详细的反馈和代码示例。这正是我想要的。
    猜你喜欢
    • 2020-12-14
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 2021-06-01
    • 1970-01-01
    • 2021-09-02
    相关资源
    最近更新 更多