elasticsearch-analyzers,Search,Analyzer,Azure Cognitive Search,elasticsearch Analyzers" /> elasticsearch-analyzers,Search,Analyzer,Azure Cognitive Search,elasticsearch Analyzers" />

Search 创建一个Edengram分析器,支持Azure搜索中的双方

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

为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
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"
            }
        ]
}