搜索查询中的噪音/停用词会删除正确的搜索结果
Noise / stop words in the search query removes correct search results
我们有不同语言的文档。为了能够在不同语言的文档中进行搜索,我们为每种语言创建了一个索引。我们确保根据文档的语言填写适用的字段。 (其他字段为空)我们不知道用哪种语言搜索,所以我们确保搜索所有字段,所以总是搜索适用的字段。
当用户提供包含 noise/stop 个词的搜索查询时,我们会遇到问题。当我们使用 searchMode=all 并使用语言分析器时,它似乎从结果集中删除了完全有效的搜索结果。
例如,我们的索引中有以下文本来测试此行为:
名称中带有 和 it 的文档标题
当我们使用以下搜索查询时,我们得到了预期的搜索结果:
search=文档标题名称&QueryType=full&searchMode=all&$count=true
但是,当我们尝试搜索确切的标题(或者甚至添加一些干扰词,如 with、the 和 in)时,当我们使用 en.microsoft 分析器时,结果不会返回。当我们使用另一种语言分析器(使用其他 noise/stop 个词)时,返回结果。
我们在使用荷兰语索引时使用 nl.microsoft 分析器得到了类似的结果,并尝试搜索也包含荷兰语 noise/stop 单词的文本,如“bij”、“in”或“en”,而这是的一部分索引文本。
有什么办法可以解决这个问题吗?这是使用语言分析器时搜索中的错误吗?
我假设如果我们创建一个搜索查询来搜索过滤 noise/stop 个单词的索引,那么 noise/stop 个单词也会在执行搜索查询之前通过认知搜索从查询中删除。
注意:我们还发现了以下Whosebugpost:
Queries with stopwords and searchMode=all return no results
似乎仅当我们使用不同语言搜索多个字段时才会出现此问题。我可以证实这一点。如果我通过使用以下查询仅搜索英语字段来测试搜索查询,我们将得到预期的结果:
search=文档标题名称&QueryType=full&searchMode=all&searchFields=Title_enus&$count=true
但是,当我尝试搜索使用英语和荷兰语的两个字段时,我不再获得英语结果:
search=文档标题名称&QueryType=full&searchMode=all&searchFields=Title_enus,Title_nlnl&$count=true
我们的实际情况与此post略有不同,因为我们使用 OR 子句在多个字段中进行搜索。如果我做了更多测试并且可以提供准确的测试查询,包括它们的结果,我会更新这个 post。
可以使用 OR 查询。您也可以使用 searchMode any。据我了解,您的内容是多语言的,每条记录有多种语言。
索引
"fields": [
{"name": "Id", "type": "Edm.String", "searchable": false, "key": true, "indexAnalyzer": null, "searchAnalyzer": null, "analyzer": null, "synonymMaps": [] },
{"name": "Title_enus", "type": "Edm.String", "searchable": true, "analyzer":"en.microsoft"},
{"name": "Title_nlnl", "type": "Edm.String", "searchable": true, "analyzer":"nl.microsoft"}],
内容
使用您 link 文章中的示例内容以及您的索引定义。
"value": [
{
"@search.action": "mergeOrUpload",
"Id": "1",
"Title_enus": "Waiting for a bus",
"Title_nlnl": "Wachten op een bus"
},
{
"@search.action": "mergeOrUpload",
"Id": "2",
"Title_enus": "Run to the hills",
"Title_nlnl": "Ren naar de heuvels"
}
]
您不知道最终用户输入的语言是什么。无论输入是什么,您都将其插入到您准备好的查询中。考虑以下示例
- search=wait for&$count=true&searchMode=all&queryType=full
- search=wait for&$count=true&searchMode=all&queryType=full&searchFields=Title_enus
- search=wait for&$count=true&searchMode=all&queryType=full&searchFields=Title_enus,Title_nlnl
- search=Title_enus:“等待”或Title_nlnl:“等待”&$count=true&searchMode=all&queryType=full
- search=wait for&$count=true&searchMode=any&queryType=full
在场景 1 中,您在两个搜索属性中进行搜索。并且所有模式都规定您的条款 wait for 必须存在于两者中。由于 Title_nlnl 属性 中不存在,因此不匹配
在场景 2 中,我指定我只想在 Title_enus 属性 内搜索。这个 是 匹配,因为 wait 匹配。术语 for 是停用词,因此会被忽略。我知道这种情况不适合您,因为您希望用户能够使用所有语言搜索所有内容。尽管如此,它还是有助于我们的理解。
在场景 3 中,我们要同时搜索 Title_enus 和 Title_nlnl 。这实际上与场景 1 相同。要匹配记录,搜索词必须同时匹配 Title_enus 和 Title_nlnl。 Title_nlnl 中没有 wait for(注意 for 没有作为停用词删除,但也没关系)。
在场景 4 中,我们使用实际的 OR 查询。您接受用户的输入,您的要求是它必须匹配 Title_enus 或 Title_nlnl。在这里,您得到记录 1 作为匹配项,正如预期的那样。
"Id": "1",
"Title_enus": "Waiting for a bus",
"Title_nlnl": "Wachten op een bus"
场景5,我们使用任意模式。这将使搜索语法更简单,并且returns与方案4相同。
我们有不同语言的文档。为了能够在不同语言的文档中进行搜索,我们为每种语言创建了一个索引。我们确保根据文档的语言填写适用的字段。 (其他字段为空)我们不知道用哪种语言搜索,所以我们确保搜索所有字段,所以总是搜索适用的字段。
当用户提供包含 noise/stop 个词的搜索查询时,我们会遇到问题。当我们使用 searchMode=all 并使用语言分析器时,它似乎从结果集中删除了完全有效的搜索结果。 例如,我们的索引中有以下文本来测试此行为: 名称中带有 和 it 的文档标题
当我们使用以下搜索查询时,我们得到了预期的搜索结果: search=文档标题名称&QueryType=full&searchMode=all&$count=true
但是,当我们尝试搜索确切的标题(或者甚至添加一些干扰词,如 with、the 和 in)时,当我们使用 en.microsoft 分析器时,结果不会返回。当我们使用另一种语言分析器(使用其他 noise/stop 个词)时,返回结果。 我们在使用荷兰语索引时使用 nl.microsoft 分析器得到了类似的结果,并尝试搜索也包含荷兰语 noise/stop 单词的文本,如“bij”、“in”或“en”,而这是的一部分索引文本。
有什么办法可以解决这个问题吗?这是使用语言分析器时搜索中的错误吗? 我假设如果我们创建一个搜索查询来搜索过滤 noise/stop 个单词的索引,那么 noise/stop 个单词也会在执行搜索查询之前通过认知搜索从查询中删除。
注意:我们还发现了以下Whosebugpost: Queries with stopwords and searchMode=all return no results 似乎仅当我们使用不同语言搜索多个字段时才会出现此问题。我可以证实这一点。如果我通过使用以下查询仅搜索英语字段来测试搜索查询,我们将得到预期的结果: search=文档标题名称&QueryType=full&searchMode=all&searchFields=Title_enus&$count=true
但是,当我尝试搜索使用英语和荷兰语的两个字段时,我不再获得英语结果: search=文档标题名称&QueryType=full&searchMode=all&searchFields=Title_enus,Title_nlnl&$count=true
我们的实际情况与此post略有不同,因为我们使用 OR 子句在多个字段中进行搜索。如果我做了更多测试并且可以提供准确的测试查询,包括它们的结果,我会更新这个 post。
可以使用 OR 查询。您也可以使用 searchMode any。据我了解,您的内容是多语言的,每条记录有多种语言。
索引
"fields": [
{"name": "Id", "type": "Edm.String", "searchable": false, "key": true, "indexAnalyzer": null, "searchAnalyzer": null, "analyzer": null, "synonymMaps": [] },
{"name": "Title_enus", "type": "Edm.String", "searchable": true, "analyzer":"en.microsoft"},
{"name": "Title_nlnl", "type": "Edm.String", "searchable": true, "analyzer":"nl.microsoft"}],
内容
使用您 link 文章中的示例内容以及您的索引定义。
"value": [
{
"@search.action": "mergeOrUpload",
"Id": "1",
"Title_enus": "Waiting for a bus",
"Title_nlnl": "Wachten op een bus"
},
{
"@search.action": "mergeOrUpload",
"Id": "2",
"Title_enus": "Run to the hills",
"Title_nlnl": "Ren naar de heuvels"
}
]
您不知道最终用户输入的语言是什么。无论输入是什么,您都将其插入到您准备好的查询中。考虑以下示例
- search=wait for&$count=true&searchMode=all&queryType=full
- search=wait for&$count=true&searchMode=all&queryType=full&searchFields=Title_enus
- search=wait for&$count=true&searchMode=all&queryType=full&searchFields=Title_enus,Title_nlnl
- search=Title_enus:“等待”或Title_nlnl:“等待”&$count=true&searchMode=all&queryType=full
- search=wait for&$count=true&searchMode=any&queryType=full
在场景 1 中,您在两个搜索属性中进行搜索。并且所有模式都规定您的条款 wait for 必须存在于两者中。由于 Title_nlnl 属性 中不存在,因此不匹配
在场景 2 中,我指定我只想在 Title_enus 属性 内搜索。这个 是 匹配,因为 wait 匹配。术语 for 是停用词,因此会被忽略。我知道这种情况不适合您,因为您希望用户能够使用所有语言搜索所有内容。尽管如此,它还是有助于我们的理解。
在场景 3 中,我们要同时搜索 Title_enus 和 Title_nlnl 。这实际上与场景 1 相同。要匹配记录,搜索词必须同时匹配 Title_enus 和 Title_nlnl。 Title_nlnl 中没有 wait for(注意 for 没有作为停用词删除,但也没关系)。
在场景 4 中,我们使用实际的 OR 查询。您接受用户的输入,您的要求是它必须匹配 Title_enus 或 Title_nlnl。在这里,您得到记录 1 作为匹配项,正如预期的那样。
"Id": "1",
"Title_enus": "Waiting for a bus",
"Title_nlnl": "Wachten op een bus"
场景5,我们使用任意模式。这将使搜索语法更简单,并且returns与方案4相同。