所以我是Azure搜索新手,我才开始明白这一点。我有一个搜索索引,用于查询非常简单的sql视图以匹配记录。我在找到我搜索的单词的完全匹配时遇到了很大的麻烦。
每当我搜索时,我只获得具有确切单词的记录。但是我也得到包含搜索到的单词的记录,例如我搜索“类型”并且我得到“新类型”和“我的类型”。我在搜索时用双引号括起“Type”。
我正在使用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")
答案 0 :(得分:2)
用双引号括起查询会将其转换为短语查询。这仅在引号之间有多个术语时才有意义,由空格,标点符号等分隔。例如,如果搜索字符串为Hello world
,则它将匹配包含“hello”或“world”的文档(如果您使用searchMode
的默认any
并假设您未明确使用任何其他运算符,但如果您的搜索字符串为"Hello world"
,则文档仅匹配术语彼此相邻。
查看您的查询,我猜您要按分类数据进行过滤。如果你真的想要一个完全匹配(区分大小写),那么你应该使用$ filter而不是search:
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
答案 1 :(得分:0)
如果要执行完全匹配,为什么不尝试使用OData过滤器?在这种情况下,您的查询将变为$ filter = DocumentType eq' Type'
请注意,如果你是azure搜索的预览版,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