我有一个azure认知搜索索引,我正在使用search.ismatch ODATA全文搜索功能来返回与特定关键作品匹配的记录。
数据
苹果
菠萝
search.ismatch('苹果', '文本')
我期望查询返回两个值,但我只得到 1。即它只匹配单词中的第一个字母。
无论搜索文本在数据中的哪个位置,如何返回数据?
基于文本子字符串进行搜索的一种可能的解决方案是在索引中使用
ngarm tokenizer
schema
。
index_definition = {
"name": index_name,
"fields": [
{"name": "id", "type": "Edm.String", "key": True, "searchable": False},
{
"name": "Text",
"type": "Edm.String",
"searchable": True,
"analyzer": "custom_analyzer",
},
],
"analyzers": [
{
"@odata.type": "#Microsoft.Azure.Search.CustomAnalyzer",
"name": "custom_analyzer",
"tokenizer": "custom_tokenizer",
"tokenFilters": ["lowercase"],
}
],
"tokenizers": [
{
"@odata.type": "#Microsoft.Azure.Search.NGramTokenizer",
"name": "custom_tokenizer",
"minGram": 5,
"maxGram": 5,
}
],
}
通过上述架构,我已经上传了给定的示例数据:
documents = [
{"@search.action": "upload", "id": "1", "Text": "apple"},
{"@search.action": "upload", "id": "2", "Text": "pineapple"},
]
有了上面的索引定义和数据,我就能够得到所需的结果。
注意: 这是演示示例代码,您可能需要根据您的需求进行修改和重新配置。
有关部分搜索的更多详细信息,您可以查看此文档。