Azure 搜索 - 语音搜索实现
Azure Search - phonetic search implementation
我曾尝试使用 Azure 搜索进行 Phoenetic 搜索,但运气不佳。我的 objective 是制定一个索引配置,可以处理拼写错误并为最终用户提供拼音搜索。
使用以下配置和示例数据,我试图搜索故意拼写错误的单词,如 'softvare' 或 'alek'。感谢语音分析器,我得到了 'alek' 的结果;但没有得到 'softvare'.
的任何结果
对于此要求,拼音搜索似乎无法解决问题。
我找到的唯一选项是使用同义词映射。主要的缺陷是我无法将语音/自定义分析器与同义词一起使用:(
您会推荐哪些不同的策略来处理拼写错误?
使用的搜索查询
?api-version=2017-11-11&search=alec
?api-version=2017-11-11&search=softvare
这里是索引配置
"name": "phonetichotels",
"fields": [
{"name": "hotelId", "type": "Edm.String", "key":true, "searchable": false},
{"name": "baseRate", "type": "Edm.Double"},
{"name": "description", "type": "Edm.String", "filterable": false, "sortable": false, "facetable": false, "analyzer":"my_standard"},
{"name": "hotelName", "type": "Edm.String", "analyzer":"my_standard"},
{"name": "category", "type": "Edm.String", "analyzer":"my_standard"},
{"name": "tags", "type": "Collection(Edm.String)", "analyzer":"my_standard"},
{"name": "parkingIncluded", "type": "Edm.Boolean"},
{"name": "smokingAllowed", "type": "Edm.Boolean"},
{"name": "lastRenovationDate", "type": "Edm.DateTimeOffset"},
{"name": "rating", "type": "Edm.Int32"},
{"name": "location", "type": "Edm.GeographyPoint"}
],
分析器(索引创建的一部分)
"analyzers":[
{
"name":"my_standard",
"@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
"tokenizer":"standard_v2",
"tokenFilters":[ "lowercase", "asciifolding", "phonetic" ]
}
]
分析 API 的输入和输出 'software'
{
"analyzer":"my_standard",
"text": "software"
}
{
"@odata.context": "https://ctsazuresearchpoc.search.windows.net/$metadata#Microsoft.Azure.Search.V2017_11_11.AnalyzeResult",
"tokens": [
{
"token": "SFTW",
"startOffset": 0,
"endOffset": 8,
"position": 0
}
]
}
分析 API 的输入和输出 'softvare'
{
"analyzer":"my_standard",
"text": "softvare"
}
{
"@odata.context": "https://ctsazuresearchpoc.search.windows.net/$metadata#Microsoft.Azure.Search.V2017_11_11.AnalyzeResult",
"tokens": [
{
"token": "SFTF",
"startOffset": 0,
"endOffset": 8,
"position": 0
}
]
}
我加载的示例数据
{
"@search.action": "upload",
"hotelId": "5",
"baseRate": 199.0,
"description": "Best hotel in town for software people",
"hotelName": "Fancy Stay",
"category": "Luxury",
"tags": ["pool", "view", "wifi", "concierge"],
"parkingIncluded": false,
"smokingAllowed": false,
"lastRenovationDate": "2010-06-27T00:00:00Z",
"rating": 5,
"location": { "type": "Point", "coordinates": [-122.131577, 47.678581] }
},
{
"@search.action": "upload",
"hotelId": "6",
"baseRate": 79.99,
"description": "Cheapest hotel in town ",
"hotelName": " Alec Baldwin Motel",
"category": "Budget",
"tags": ["motel", "budget"],
"parkingIncluded": true,
"smokingAllowed": true,
"lastRenovationDate": "1982-04-28T00:00:00Z",
"rating": 1,
"location": { "type": "Point", "coordinates": [-122.131577, 49.678581] }
},
通过正确的配置,即使拼错的单词我也应该得到结果。
我从事 Azure 搜索。在我建议处理拼写错误的单词的方法之前,查看您的自定义分析器 (my_standard) 配置会很有帮助。它可能会告诉我们为什么它无法处理 'softvare' 的情况。作为 DIY,您可以使用 Analyze API 查看使用自定义分析器创建的令牌,它应该包含 'software' 以实际匹配文档。
那么,这里有几种方法可以单独使用或结合使用来处理拼写错误的单词。最佳方法因用例而异,我强烈建议您尝试这些方法以找出适合您的情况的最佳方法。
您已经熟悉语音过滤器,这是处理发音相似的术语的常用方法。如果您还没有,请为过滤器尝试不同的编码器,以评估哪种配置可以为您提供最佳结果。查看编码器列表 here.
使用作为 Azure 搜索中 Lucene 查询语法的一部分支持的模糊查询,其中 returns 项基于距离度量接近原始查询项。这里的限制是它适用于单个术语。查看 docs 了解更多详情。示例查询如下所示 - search=softvare~1
在原始术语也是有效术语的情况下,您还可以使用术语提升来为原始术语提供更多提升。
您还提到了同义词,它也用于查询拼写错误的术语。这种方法使您可以最大程度地控制处理拼写错误的过程,但也需要您事先了解术语的不同拼写错误。如果您想尝试同义词,可以使用这些 docs。
正如您在我的 post 中看到的那样;我的 Objective 是用来处理错别字的。
唯一简单的选择是使用内置的 Lucene 功能 - 模糊搜索。我还没有检查响应时间,因为查询类型必须设置为 'full' 才能使用模糊搜索。否则,结果令人满意。
示例:
search=softvare~&fuzzy=true&querytype=full
将 return 所有包含 'Software' 的文档。
如需进一步阅读,请阅读 Documentation
我曾尝试使用 Azure 搜索进行 Phoenetic 搜索,但运气不佳。我的 objective 是制定一个索引配置,可以处理拼写错误并为最终用户提供拼音搜索。
使用以下配置和示例数据,我试图搜索故意拼写错误的单词,如 'softvare' 或 'alek'。感谢语音分析器,我得到了 'alek' 的结果;但没有得到 'softvare'.
的任何结果对于此要求,拼音搜索似乎无法解决问题。
我找到的唯一选项是使用同义词映射。主要的缺陷是我无法将语音/自定义分析器与同义词一起使用:(
您会推荐哪些不同的策略来处理拼写错误?
使用的搜索查询
?api-version=2017-11-11&search=alec
?api-version=2017-11-11&search=softvare
这里是索引配置
"name": "phonetichotels",
"fields": [
{"name": "hotelId", "type": "Edm.String", "key":true, "searchable": false},
{"name": "baseRate", "type": "Edm.Double"},
{"name": "description", "type": "Edm.String", "filterable": false, "sortable": false, "facetable": false, "analyzer":"my_standard"},
{"name": "hotelName", "type": "Edm.String", "analyzer":"my_standard"},
{"name": "category", "type": "Edm.String", "analyzer":"my_standard"},
{"name": "tags", "type": "Collection(Edm.String)", "analyzer":"my_standard"},
{"name": "parkingIncluded", "type": "Edm.Boolean"},
{"name": "smokingAllowed", "type": "Edm.Boolean"},
{"name": "lastRenovationDate", "type": "Edm.DateTimeOffset"},
{"name": "rating", "type": "Edm.Int32"},
{"name": "location", "type": "Edm.GeographyPoint"}
],
分析器(索引创建的一部分)
"analyzers":[
{
"name":"my_standard",
"@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
"tokenizer":"standard_v2",
"tokenFilters":[ "lowercase", "asciifolding", "phonetic" ]
}
]
分析 API 的输入和输出 'software'
{
"analyzer":"my_standard",
"text": "software"
}
{
"@odata.context": "https://ctsazuresearchpoc.search.windows.net/$metadata#Microsoft.Azure.Search.V2017_11_11.AnalyzeResult",
"tokens": [
{
"token": "SFTW",
"startOffset": 0,
"endOffset": 8,
"position": 0
}
]
}
分析 API 的输入和输出 'softvare'
{
"analyzer":"my_standard",
"text": "softvare"
}
{
"@odata.context": "https://ctsazuresearchpoc.search.windows.net/$metadata#Microsoft.Azure.Search.V2017_11_11.AnalyzeResult",
"tokens": [
{
"token": "SFTF",
"startOffset": 0,
"endOffset": 8,
"position": 0
}
]
}
我加载的示例数据
{
"@search.action": "upload",
"hotelId": "5",
"baseRate": 199.0,
"description": "Best hotel in town for software people",
"hotelName": "Fancy Stay",
"category": "Luxury",
"tags": ["pool", "view", "wifi", "concierge"],
"parkingIncluded": false,
"smokingAllowed": false,
"lastRenovationDate": "2010-06-27T00:00:00Z",
"rating": 5,
"location": { "type": "Point", "coordinates": [-122.131577, 47.678581] }
},
{
"@search.action": "upload",
"hotelId": "6",
"baseRate": 79.99,
"description": "Cheapest hotel in town ",
"hotelName": " Alec Baldwin Motel",
"category": "Budget",
"tags": ["motel", "budget"],
"parkingIncluded": true,
"smokingAllowed": true,
"lastRenovationDate": "1982-04-28T00:00:00Z",
"rating": 1,
"location": { "type": "Point", "coordinates": [-122.131577, 49.678581] }
},
通过正确的配置,即使拼错的单词我也应该得到结果。
我从事 Azure 搜索。在我建议处理拼写错误的单词的方法之前,查看您的自定义分析器 (my_standard) 配置会很有帮助。它可能会告诉我们为什么它无法处理 'softvare' 的情况。作为 DIY,您可以使用 Analyze API 查看使用自定义分析器创建的令牌,它应该包含 'software' 以实际匹配文档。
那么,这里有几种方法可以单独使用或结合使用来处理拼写错误的单词。最佳方法因用例而异,我强烈建议您尝试这些方法以找出适合您的情况的最佳方法。
您已经熟悉语音过滤器,这是处理发音相似的术语的常用方法。如果您还没有,请为过滤器尝试不同的编码器,以评估哪种配置可以为您提供最佳结果。查看编码器列表 here.
使用作为 Azure 搜索中 Lucene 查询语法的一部分支持的模糊查询,其中 returns 项基于距离度量接近原始查询项。这里的限制是它适用于单个术语。查看 docs 了解更多详情。示例查询如下所示 -
search=softvare~1
在原始术语也是有效术语的情况下,您还可以使用术语提升来为原始术语提供更多提升。您还提到了同义词,它也用于查询拼写错误的术语。这种方法使您可以最大程度地控制处理拼写错误的过程,但也需要您事先了解术语的不同拼写错误。如果您想尝试同义词,可以使用这些 docs。
正如您在我的 post 中看到的那样;我的 Objective 是用来处理错别字的。
唯一简单的选择是使用内置的 Lucene 功能 - 模糊搜索。我还没有检查响应时间,因为查询类型必须设置为 'full' 才能使用模糊搜索。否则,结果令人满意。
示例:
search=softvare~&fuzzy=true&querytype=full
将 return 所有包含 'Software' 的文档。
如需进一步阅读,请阅读 Documentation