Search 创建一个Edengram分析器,支持Azure搜索中的双方
为Azure Search定义自定义分析器时,可以从列表中定义令牌筛选器。 我试图同时支持前缀和中缀的搜索。 例如:如果字段包含名称:123 456,我希望可搜索的术语包含:Search 创建一个Edengram分析器,支持Azure搜索中的双方,search,analyzer,azure-cognitive-search,
elasticsearch-analyzers,Search,Analyzer,Azure Cognitive Search,
elasticsearch Analyzers,为Azure Search定义自定义分析器时,可以从列表中定义令牌筛选器。 我试图同时支持前缀和中缀的搜索。 例如:如果字段包含名称:123 456,我希望可搜索的术语包含: 1 12 123 23 3 4 45 456 56 6 当使用EdgeNGramTokenFilterV2时,似乎可以做到这一点,可以选择定义“side”属性,但只支持“front”和“back”,而不支持两者。 “front”(默认)值生成此列表: 1 12 123 4 45 456 并返回生成: 123 23 3
1
12
123
23
3
4
45
456
56
6
当使用EdgeNGramTokenFilterV2时,似乎可以做到这一点,可以选择定义“side”属性,但只支持“front”和“back”,而不支持两者。
“front”(默认)值生成此列表:
1
12
123
4
45
456
并返回生成:
123
23
3
456
56
6
我尝试使用两个token two EdgengramTokenFilterv2,但这会通过组合两个过滤器创建术语,例如:“2”或“5”:
我还尝试使用“反向”标记,但这会反转所有内容,结果仍然是错误的
我只使用一个搜索字段(“名称”),希望它保持这样。(考虑过在不同的分析器中使用名为“name_reverse”的不同字段的选项,但这是非常低效的,并且在将搜索引擎连接到数据源时会引起很多麻烦
为便于参考,这是当前的索引创建请求:
{
"name": "testindexboth",
"fields": [
{"name": "id", "type": "Edm.String", "key": true },
{"name": "Name", "type": "Edm.String", "searchable": true, "analyzer": "myAnalyzer"}
],
"myAnalyzer": [
{
"name": "myAnalyzer",
"@odata.type": "#Microsoft.Azure.Search.CustomAnalyzer",
"tokenizer": "standard_v2",
"tokenFilters":["front_filter", "back_filter"]
}],
"tokenFilters":[
{
"name":"front_filter",
"@odata.type":"#Microsoft.Azure.Search.EdgeNGramTokenFilterV2",
"maxGram":15,
"side": "front"
},
{
"name":"back_filter",
"@odata.type":"#Microsoft.Azure.Search.EdgeNGramTokenFilterV2",
"maxGram":15,
"side": "back"
}
]
}
有没有一种方法可以将这两个字段组合起来,而不使它们扰乱结果?在索引中添加两个字段,使用两个不同的自定义分析器:一个用于前缀,一个用于后缀。在查询时,对这两个字段进行查询。这肯定会起作用,但似乎有点像黑客,你不觉得吗?这也迫使我使用字段映射功能。在两个字段上执行搜索,使用未反转的字段进行提取,没有意义拾取反转的数据,同意,这是有效的。详细解决方案:
{
"name": "testindexboth",
"fields": [
{"name": "id", "type": "Edm.String", "key": true },
{"name": "Name", "type": "Edm.String", "searchable": true, "analyzer": "myAnalyzer"}
],
"myAnalyzer": [
{
"name": "myAnalyzer",
"@odata.type": "#Microsoft.Azure.Search.CustomAnalyzer",
"tokenizer": "standard_v2",
"tokenFilters":["front_filter", "back_filter"]
}],
"tokenFilters":[
{
"name":"front_filter",
"@odata.type":"#Microsoft.Azure.Search.EdgeNGramTokenFilterV2",
"maxGram":15,
"side": "front"
},
{
"name":"back_filter",
"@odata.type":"#Microsoft.Azure.Search.EdgeNGramTokenFilterV2",
"maxGram":15,
"side": "back"
}
]
}