如果我在内容中有一个包含此词的文档:
" dolor de cabeza"使用西班牙语分析仪,搜索" dolor de cabeza"返回文件确定。但是使用dolor de cabeza(没有引号)什么都不返回。
实际上,当使用queryType = Full和searchMode = All时,搜索查询中的每个停用词都会使其不返回任何文件。
使用引用方法的问题是它只匹配确切的句子。
有没有解决方法?我认为这是一个BUG。
答案 0 :(得分:1)
简短版本:
当您使用 searchMode = All 针对使用以不同方式处理停用词的分析程序的字段发出搜索查询时,会发生这种情况。请确保使用 searchFields 搜索请求参数将查询范围仅限于使用相同分析器分析的字段。或者,您可以在所有可搜索字段上设置相同的 searchAnalyzer ,以相同的方式从查询中删除停用词。要了解有关自定义分析器的更多信息以及如何独立搜索 indexAnalyzer 和 searchAnalyzer ,请转到here。
长版:
让我们看一个带有两个字段的索引,其中一个用英文Lucene分析器分析,另一个用标准(默认)分析器分析。
{
"fields":[
{
"name":"docId",
"type":"Edm.String",
"key":true,
"searchable":false
},
{
"name":"field1",
"type":"Edm.String",
"analyzer":"en.lucene"
},
{
"name":"field2",
"type":"Edm.String"
}
]
}
让我们添加这两个文件:
{
"value":[
{
"docId":"1",
"field1":"Waiting for a bus",
"field2":"Exploring cosmos"
},
{
"docId":"2",
"field1":"Run to the hills",
"field2":"run for your life"
}
]
}
以下查询不会返回任何结果 search = wait + for& searchMode = all
这是因为此查询中的术语是由为该字段定义的分析器为索引中的每个字段独立处理的。 对于 field1 ,查询变为 search = wait ('for'被删除,因为它是一个停用词) 对于 field2 ,它保持 search = wait + for (标准分析器不会删除停用词)。
只有第一个文档与'wait'匹配(在第一个字段中),但是第一个文档中的第二个字段与'for'不匹配,因此没有结果。当您设置searchMode = all时,您告诉搜索引擎所有查询字词必须至少匹配一次。
为了进行比较,另一个带有停用词 search = running + for& searchMode = all 的查询会返回第二个文档作为结果。术语“正在运行”匹配 field1 (它已被阻止)和'for'匹配 field2 。
要了解有关Azure搜索中查询处理的详细信息,请阅读How full text search works in Azure Search