将word_delimiter与edgeNGram一起使用会忽略Word_Delimiter Token

时间:2016-03-08 13:03:42

标签: elasticsearch

我的定制分析仪如下所示。但我不明白如何实现我的目标。

我的目标是我希望将空白分隔的倒排索引,但我想在用户输入最小3个字符后拥有自动完成功能。为此,我将word_delimiter和edgeNGram标记结合起来,如下所示

{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "my_analyzer": {
            "tokenizer": "whitespace",
            "filter": [
              "standard",
              "lowercase",
              "my_word_delimiter",
              "my_edge_ngram_analyzer"
            ],
            "type": "custom"
          }
        },
        "filter": {
          "my_word_delimiter": {
            "catenate_all": true,
            "type": "word_delimiter"
          },
          "my_edge_ngram_analyzer": {
            "min_gram": 3,
            "max_gram": 10,
            "type": "edgeNGram"
          }
        }
      }
    }
  }
}

这将给"兄弟TN-200"如下。但我期待" tn"因为我有word_delimiter标记也在恢复索引中。为什么不在倒排索引?我怎样才能做到这一点?

curl -XGET "localhost:9200/myIndex/_analyze?analyzer=my_analyzer&pr
    etty=true" -d "Brother TN-200"
    {
      {
        "token" : "bro",
        "start_offset" : 14,
        "end_offset" : 21,
        "type" : "word",
        "position" : 2
      }, {
        "token" : "brot",
        "start_offset" : 14,
        "end_offset" : 21,
        "type" : "word",
        "position" : 2
      }, {
        "token" : "broth",
        "start_offset" : 14,
        "end_offset" : 21,
        "type" : "word",
        "position" : 2
      }, {
        "token" : "brothe",
        "start_offset" : 14,
        "end_offset" : 21,
        "type" : "word",
        "position" : 2
      }, {
        "token" : "brother",
        "start_offset" : 14,
        "end_offset" : 21,
        "type" : "word",
        "position" : 2
      }, {
        "token" : "tn2",
        "start_offset" : 22,
        "end_offset" : 28,
        "type" : "word",
        "position" : 3
      }, {
        "token" : "tn20",
        "start_offset" : 22,
        "end_offset" : 28,
        "type" : "word",
        "position" : 3
      }, {
        "token" : "tn200",
        "start_offset" : 22,
        "end_offset" : 28,
        "type" : "word",
        "position" : 3
      }, {
        "token" : "200",
        "start_offset" : 25,
        "end_offset" : 28,
        "type" : "word",
        "position" : 4
      }]
    }

更新:

当然,如果我使用" min_gram":2," tn"将在恢复索引中,但我不想要这个,因为如果任何其他单词包括" tn"在单词内,它将出现在结果列表中 例如关于" hp"关键词。我正在为#34; Hewlett Packard"因为我的产品就像" hp xxx"但我也得到了一种名为" tech hpc"的产品。在输入" hpc"之前,我不希望显示此产品。这就是我设置3的原因。

如果我不使用edgeNGram tokenizer而只使用word_delimiter," tn"因为兄弟TN-200将被索引为兄弟,tn和200,所以在倒排索引中。这就是为什么我期望word_delimiter成为" tn"在倒排索引中。如果我将它与edgeNGram一起使用,它没用吗? -

1 个答案:

答案 0 :(得分:1)

my_edge_ngram_analyzer中,min_gram设置为3,因此任何长度小于3个代码点的令牌都不会显示。 如果您希望显示TN,则需要将其设置为2。

示例:

get <my_index>/_analyze?tokenizer=whitespace&filters=my_edge_ngram_analyzer&text=TN

上述调用将返回0个令牌。