如何解决没有定义或多个SearchField时,Azure搜索无法返回预期结果
我有一个相当基本的Azure搜索索引,其中包含可搜索字符串数据的多个字段,例如[节略] ...
"fields": [
{
"name": "Field1","type": "Edm.String","facetable": false,"filterable": true,"key": true,"retrievable": true,"searchable": true,"sortable": false,"analyzer": null,"indexAnalyzer": null,"searchAnalyzer": null,"synonymMaps": [],"fields": []
},{
"name": "Field2","analyzer": "en.microsoft","fields": []
}
]
Field1
装有字母数字id数据,而Field2
装有英语字符串数据,特别是记录的名称/标题。 searchMode=all
也被用来确保结果的准确性。
比方说,索引的记录之一具有以下Field2
数据:BA (Hons) in Business,Organisational Behaviour and Coaching
。将其放入en.microsoft
分析器中,这就是我们得到的结果:
"tokens": [
{
"token": "ba","startOffset": 0,"endOffset": 2,"position": 0
},{
"token": "hon","startOffset": 4,"endOffset": 8,"position": 1
},{
"token": "hons",{
"token": "business","startOffset": 13,"endOffset": 21,"position": 3
},{
"token": "organizational","startOffset": 23,"endOffset": 37,"position": 4
},{
"token": "organisational",{
"token": "behavior","startOffset": 38,"endOffset": 47,"position": 5
},{
"token": "behaviour",{
"token": "coach","startOffset": 52,"endOffset": 60,"position": 7
},{
"token": "coaching","position": 7
}
]
如您所见,返回的令牌就是您期望的此类字符串。但是,当使用相同的索引字符串值作为搜索词时(在这种情况下,这是一个有效的用户案例),除非您明确使用searchFields=Field2
,否则返回的结果将不符合预期。
查询1(返回0个结果):
?searchMode=all&search=BA%20(Hons)%20in%20Business%2C%20Organisational%20Behaviour%20and%20Coaching
查询2(返回0个结果):
?searchMode=all&searchFields=Field1,Field2&search=BA%20(Hons)%20in%20Business%2C%20Organisational%20Behaviour%20and%20Coaching
查询3(按预期返回1个结果):
?searchMode=all&searchFields=Field2&search=BA%20(Hons)%20in%20Business%2C%20Organisational%20Behaviour%20and%20Coaching
那么为什么只返回searchFields=Field2
而没有定义searchFields
或searchFields=Field1,Field2
却没有返回预期结果?我不希望Field1
上的不匹配项排除在Field2
上明显匹配的结果?
此外,删除搜索词中的"in"
和"and"
似乎可以解决问题并返回预期结果。例如:
查询4(按预期返回1个结果):
?searchMode=all&search=BA%20(Hons)%20Business%2C%20Organisational%20Behaviour%20Coaching
(这几乎就像是一个分析器将索引数据标记化,而一个完全不同的分析器将搜索项标记化,尽管考虑到查询3时该理论没有任何意义,因为使用完全相同的索引数据/搜索词。)
由于我完全没有想法,在文档中找不到更多内容了,所以有人能够阐明这里发生的事情吗?
NB。请记住,我希望了解为什么Azure搜索会以这种方式运行,而不一定需要解决。
解决方法
之所以没有获得任何成功,是因为使用 searchMode = all 时如何处理停用词。标准分析器不会删除停用词。 Lucene和Microsoft的英语分析器删除了停用词。我通过使用您的属性定义和示例数据创建索引来进行验证。如果使用 standard 分析器,则不会删除停用词,并且在使用searchMode = all时也会获得匹配项。要在使用简单查询模式的Lucene或Microsoft分析仪时获得匹配,您必须使用词组搜索。
在示例中测试en.microsoft分析器时,您只会从分析器第一阶段所做的事情中得到响应。它将查询拆分为令牌。在您的情况下,其中两个标记也是英语中的停用词(in和)。停用词删除是词法分析的一部分,后面将在stage 2中进行,如名为Anatomy of a search request的文章中所述。此外,词法分析仅应用于“需要完整术语的查询类型”,例如 searchMode = all 。有关更多示例,请参见Exceptions to lexical analysis。
在此之前,有一篇有关此内容的详细说明。参见Queries with stopwords and searchMode=all return no results
我知道您并没有要求解决方法,但是为了更好地了解发生了什么,列出一些可能的解决方法可能会很有用。
- 对于英语分析人员,使用短语搜索,将查询括在引号中: search =“业务,组织行为和辅导方面的文学学士(荣誉)学位”&searchMode = all
- 标准分析器以您期望的方式工作: search =业务,组织行为和指导方面的文学学士(荣誉)学位
- 通过defining a custom analyzer禁用词法分析。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。