Bar*_*xto 2 azure-cognitive-search
如果我有一份内容包含以下内容的文档:
“dolor de cabeza”使用西班牙语分析器,搜索“dolor de cabeza”返回文档正常。但使用 dolor de cabeza (不带引号)不会返回任何内容。
实际上,当使用 queryType=Full 和 searchMode=All 时,搜索查询中的每个停用词都会使其不返回任何文档。
使用引用方法的问题是它只能匹配确切的句子。
有什么解决方法吗?我认为这是一个BUG。
简洁版本:
\n\n当您针对使用以不同方式处理停用词的分析器的字段发出带有searchMode=All的搜索查询时,会发生这种情况。请确保您的查询范围仅限于使用searchFields搜索请求参数使用同一分析器分析的字段。或者,您可以在所有可搜索字段上设置相同的searchAnalyzer,以相同的方式从查询中删除停用词。要了解有关自定义分析器以及如何独立搜索indexAnalyzer和searchAnalyzer的更多信息,请转到此处。
\n\n长版:
\n\n让\xe2\x80\x99s 获取一个包含两个字段的索引,其中一个字段使用英语Lucene 分析器进行分析,另一个使用标准(默认)分析器进行分析。
\n\n{\n "fields":[\n {\n "name":"docId",\n "type":"Edm.String",\n "key":true,\n "searchable":false\n },\n {\n "name":"field1",\n "type":"Edm.String",\n "analyzer":"en.lucene"\n },\n {\n "name":"field2",\n "type":"Edm.String"\n }\n ]\n}\nRun Code Online (Sandbox Code Playgroud)\n\n让\xe2\x80\x99s添加这两个文档:
\n\n{\n "value":[\n {\n "docId":"1",\n "field1":"Waiting for a bus",\n "field2":"Exploring cosmos"\n },\n {\n "docId":"2",\n "field1":"Run to the hills",\n "field2":"run for your life"\n }\n ]\n}\nRun Code Online (Sandbox Code Playgroud)\n\n以下查询不\xe2\x80\x99返回任何结果search=wait+for&searchMode=all
\n\n这是因为该查询中的术语是由为索引中的每个字段定义的分析器独立处理的。\n对于field1,查询变为search=wait(\xe2\x80\x98for\xe2\x80\x99 已被删除,因为它是停用词)\n对于field2,它保持search=wait+for(标准分析器不\xe2\x80 \x99t 删除停用词)。
\n\n只有第一个文档与 \xe2\x80\x98wait\xe2\x80\x99 (在第一个字段中)匹配,但是第一个文档中的第二个字段与 \xe2\x80\x99t 匹配 \xe2\x80\x98for\xe2\x80 \x99,因此没有结果。当您设置 searchMode=all 时,您告诉搜索引擎所有查询词必须至少匹配一次。
\n\n为了进行比较,另一个带有停用词search=running+for&searchMode=all 的查询返回第二个文档作为结果。术语 \xe2\x80\x98running\xe2\x80\x99 匹配 field1 ( it\xe2\x80\x99s 词干)和 \xe2\x80\x98for\xe2\x80\x99 匹配field2。
\n\n要了解有关 Azure 搜索中查询处理的更多信息,请阅读Azure 搜索中全文搜索的工作原理
\n