【发布时间】: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