【问题标题】:using word_delimiter with edgeNGram ignores Word_Delimiter Token将 word_delimiter 与 edgeNGram 一起使用会忽略 Word_Delimiter 令牌
【发布时间】:2018-10-18 21:59:36
【问题描述】:

我有如下的自定义分析器。但我不明白如何实现我的目标。

我的目标是我希望有空格分隔的倒排索引,但我也希望在用户输入最少 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"
          }
        }
      }
    }
  }
}

这将为“Brother 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”关键字。我正在为“Hewlett Packard”获取产品,因为我的产品类似于“hp xxx”,但我也得到了一个名为“tech hpc”的产品。在我输入“hpc”之前,我不希望显示此产品。这就是我设置 3 的原因。

如果我不使用 edgeNGram 标记器而只使用 word_delimiter,“tn”在倒排索引中,因为 Brother TN-200 将被索引为兄弟、tn 和 200。这就是为什么我希望 word_delimiter 使“tn”在倒排索引。如果我将它与 edgeNGram 一起使用它没有用吗? ——

【问题讨论】:

    标签: elasticsearch


    【解决方案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 个令牌。

    【讨论】:

    • 是的,我知道它应该是 2,但我更喜欢 3,因为我不希望任何其他产品包含“tn”应该显示在结果列表中。例如关于“hp”。我正在为“Hewlett Packard”获取产品,因为我的产品类似于“hp xxx”,但我也得到了一个名为“tech hpc”的产品。在我输入“hpc”之前,我不希望显示此产品。
    • 另一方面,如果我不使用 edgeNGram 标记器而只使用 word_delimiter,则“tn”在倒排索引中。这就是为什么我希望 word_delimiter 使“tn”被索引。和edgeNGram一起用没用吗?
    • 如果 word-delimiter 过滤器产生 2 个或更少代码点的标记,my-edge-ngram 会忽略它们,就像如果 word-delimiter 不存在它会忽略 2 或更少的任何标记一样。另外,我不明白为什么当您为产品“hp xxx”键入“hp”时会得到“hewlett packard”。 my_edge_ngram 应该从倒排索引中删除“hp”,只有 hpc 会保留 curl -Xget "http://&lt;localhost&gt;/_analyze?analyzer=my_analyzer&amp;text=hp xxx"
    • 一种解决方法是在索引时创建字段的两个views,一个不使用edge-ngram 进行分析,另一个使用edge-ngram 过滤器进行分析,并对两者进行should match 并提供更高的提升到前一条。这样hp/ tn 就会出现,你会在 3 个或更少的字符上自动完成
    • 关于 hp,我的意思是当我设置“min_gram”时:2,但你说清楚了为什么它不起作用。我会尝试你的建议并让你知道。谢谢
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 2016-06-23
    • 2021-06-17
    • 1970-01-01
    • 2019-07-04
    • 2011-07-12
    相关资源
    最近更新 更多