2017-04-10 43 views
0

所以我是新来的Azure搜索,我只是开始弄清楚。我有一个搜索索引,查询匹配记录的一个非常简单的SQL视图。我正在为搜索的单词找到完全匹配的麻烦。从azure搜索返回的记录仅匹配确切的serch字词

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

我使用C#SDK,当我通过邮差执行搜索,还发生了:

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")

回答

1

括在双引号中查询其变为一个词组查询。如果您的搜索字符串是Hello world,它将匹配包含“hello”或“world”的文档(如果您使用的是包含“hello”或“world”的文档),那么这仅适用于引号之间存在多个词语并以空格,标点符号等分隔的词语。使用默认searchModeany并假设您没有明确使用任何其他运算符),但是如果您的搜索字符串是"Hello world",那么文档只在两个项彼此相邻时才匹配。

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

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

+0

嗨@Bruce感谢您的回答。我花了一段时间才弄清楚所有的选项,参数,设置等...有很多组合:)这很难区分C#和rest api搜索方法以及每种方法的选项。我最初尝试使用过滤器,但不断收到语法错误,因此最终我将术语和过滤器转换为搜索查询,就像我上面添加的那样。我会再次尝试过滤器,看看我能否让他们工作。 –

+0

嗨@布鲁斯,我刚刚使用过滤器实现的一个问题是,对于搜索术语,我不想将其缩小到特定字段 - 我想在所有字段中搜索术语。当用户输入搜索词时,我无法知道它适用于哪个字段。随着下拉,我可以指定特定的字段,然后使用过滤器,但不与搜索词。 –

+0

您可以在同一请求中一起使用过滤器和搜索。它们被有效地联合在一起。使用搜索由用户输入的术语,并使用过滤器来查看固定类别或用户指定准确标准的其他字段。 –

0

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

请注意,如果您是azure搜索的预览版本,api-version = 2015-02-28-Preview,则会添加新的部分过滤器匹配。

搜索。ismatch(“filedvalue”,“fieddname”)和saerch.ismatchscoring()

另外,您是否检查过自定义分析器?如果你知道你将永远在几个领域进行精确匹配,然后使用“关键字”分析与小写tokeniser

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

相关问题