【问题标题】:Return records from azure search that match the exact search term only从 azure 搜索返回仅匹配确切搜索词的记录
【发布时间】:2017-04-10 20:34:58
【问题描述】:

所以我是 Azure 搜索的新手,我才刚刚开始弄明白。我有一个搜索索引,可以查询一个非常简单的 sql 视图以查找匹配记录。我很难找到与我搜索的字词完全匹配的内容。

每当我搜索时,我都会得到包含确切单词的记录。但是我也会得到包含搜索单词的记录,例如,我搜索“类型”并得到“新类型”和“我的类型”。我在搜索时将“类型”括在双引号中。

我使用的是 C# SDK,当我通过 Postman 执行搜索时也会发生这种情况:

https://myapp.search.windows.net/indexes/myindex/docs?$select=AlertDate,DocumentName,City,DocumentType&search=(DocumentType:"Type")&$count=true&queryType=full&searchMode=any&api-version=2016-09-01

知道什么可能导致这种情况以及我如何才能获得完全匹配?我已经阅读了相当多的内容,一些帖子和网页说用双引号将搜索词括起来只会得到确切的词,但这似乎不正确,至少对我来说不是。

编辑:

为了完整起见,我应该添加我在 C# 中使用的调用来检索结果:

var result = await indexClient.Documents.SearchAsync(query, new SearchParameters()   
{ Facets = parameters.Facets, QueryType = QueryType.Full, SearchMode = SearchMode.Any,   
Top = request.Top, Skip = request.Skip, IncludeTotalResultCount = true });

有时搜索可能只是一个词或多个词,有时它可能是用户从国家和城市等下拉菜单中选择的过滤器,或两者的组合。然后我形成这样的查询字符串:

(Country:"France" OR "Germany") AND (City:"Paris")

如果它还包含搜索词,则查询将如下所示:

"Type" AND (Country:"Italy" OR "France") AND (City:"Paris" OR "Rome")

【问题讨论】:

    标签: azure search azure-cognitive-search


    【解决方案1】:

    用双引号将查询括起来会将其转换为短语查询。这仅在引号之间有多个词时才有意义,由空格、标点符号等分隔。例如,如果您的搜索字符串是Hello world,它将匹配包含“hello”或“world”的文档(如果您'使用any 的默认searchMode 并假设您没有明确使用任何其他运算符),但如果您的搜索字符串是"Hello world",那么文档仅在这两个术语彼此相邻时才匹配。

    查看您的查询,我猜您想按分类数据进行过滤。如果您真的想要完全匹配(区分大小写),那么您应该使用 $filter 而不是搜索:

    https://myapp.search.windows.net/indexes/myindex/docs?$select=AlertDate,DocumentName,City,DocumentType&$filter=DocumentType eq 'Type'&$count=true&queryType=full&searchMode=any&api-version=2016-09-01

    以下是一些有用的链接,用于在 Azure 搜索中构建过滤器和搜索查询:

    https://docs.microsoft.com/rest/api/searchservice/lucene-query-syntax-in-azure-search https://docs.microsoft.com/rest/api/searchservice/odata-expression-syntax-for-azure-search

    【讨论】:

    • 嗨@Bruce 感谢您的回答。我花了一些时间来弄清楚所有选项、参数、设置等......有很多组合:) 也很难区分 C# 和 rest api 搜索方法以及每种方法使用的选项。我最初尝试使用过滤器,但不断收到语法错误,所以最后我将术语和过滤器加入到搜索查询中,就像我在上面添加的那样。我会再次尝试过滤器,看看能否让它们正常工作。
    • 你好@Bruce,我刚刚意识到使用过滤器的一个问题是,对于搜索词,我不想将其缩小到特定字段 - 我想搜索所有词字段。当用户输入搜索词时,我无法知道它适用于哪个字段。通过下拉菜单,我可以指定特定字段,然后使用过滤器,但不能使用搜索词。
    • 您可以在同一个请求中同时使用过滤和搜索。它们有效地与在一起。对用户输入的字词使用搜索,对用户指定精确条件的固定类别或其他字段等内容使用过滤器。
    • @some_randomer 如果您发现此答案有用,请考虑将其标记为已接受。谢谢!
    • 嗨@Brue 感谢您的更新。您说“使用搜索用户输入的术语”,但这仍然给我留下了最初的问题 - 搜索“类型”也将返回“新类型”和“我的类型”。
    【解决方案2】:

    如果要执行完全匹配,为什么不尝试 OData 过滤器?在这种情况下,您的查询将变为 $filter=DocumentType eq 'Type'

    请注意,如果您是 azure search 的预览版,api-version=2015-02-28-Preview,他们为部分匹配添加了新过滤器。

    search.ismatch("filedvalue", "fieddname") 和 saerch.ismatchscoring()

    另外,您是否检查了自定义分析器?如果您知道您将始终在少数字段上执行完全匹配,那么请使用带有小写标记器的“关键字”分析器

    https://docs.microsoft.com/en-us/rest/api/searchservice/custom-analyzers-in-azure-search

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      相关资源
      最近更新 更多