我应该为非空白用户名使用哪个自动完成索引时间分析器?

问题描述 投票:0回答:1

在涉及ElasticSearch的用法时,我是一个相对新手。

目前,我正在尝试设置自动完成功能,以便在我们的应用中搜索用户名,但是我遇到了一个问题,完成建议器没有给我预期的结果。这是我最初映射属性的方式。

        'properties' : {  
          'username' : {  
            'type' : 'keyword',  
            'fields' : {  
              'text' : {  
                'type' : 'text'  
              },  
              'suggest' : {  
                'type' : 'completion'  
              }  
            }  
          }
        }

用户名仅限于大写的字母数字字符。 (0-9,A-Z,没有空白)

我遇到的问题是,由于默认的simple分析器,精确匹配TIM的加权与3TIM相同。但是看看标准分析器,至少根据this看来,只有空格之间的文字被标记化了。

我可以通过在username.suggest字段上指定标准tokenizer来预期我的预期行为吗?或者我是否尝试完全错误,我应该使用完全不同的分析器和edge_ngrams?

elasticsearch
1个回答
0
投票

使用completion字段类型时,通常不需要使用任何edge-ngram,这就是completion字段在内部执行的操作。

但是,你是对的,simple分析器默认用于completion类型,它会丢弃所有数字,即只要它遇到一个不是字母的字符就会分割输入。因此,只有当您的数据只有[a-zA-Z]时才会起作用,这不是您的情况。

由于您的输入只包含一个令牌用户名,因此您可以使用standard分析器。如果有多个令牌,我会因为停用词令牌过滤器而阻止您使用它,但由于情况并非如此,您可以安全地使用它。

如果您必须在多令牌输入上使用完成,通常最有效的方法是创建一个custom分析器,其中包含whitespaceclassic标记器和lowercase标记过滤器,如下所示:

    "suggest_analyzer": {
      "type": "custom",
      "tokenizer": "classic",
      "filter": [
        "lowercase"
      ]
    },

您的里程可能会有所不同,但上述分析仪是您可以建立的良好基础。

© www.soinside.com 2019 - 2024. All rights reserved.