我有我的自定义分析器,如下所示。但我不明白如何实现我的目标。使用带有edgeNGram的word_delimiter忽略Word_Delimiter令牌
我的目标是,我想有空格分隔倒排索引,但我想在用户输入分钟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令牌。为什么它不在倒排索引中?我怎样才能做到这一点?
url -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
}]
}
UPDATE:
当然,如果我用“min_gram”:2,“TN”将在恢复指数,但我不想这样,因为如果任何其他字由“TN”内单词,它会出现在结果列表中。
例如,关于“hp”关键字。我正在为“惠普”购买产品,因为我的产品就像“hp xxx”,但我也得到了一种名为“tech hpc”的产品。我不希望这个产品被显示,直到我输入“hpc”。这就是我之所以设置3
如果我不使用edgeNGram分词器,但只有word_delimiter,“TN”在倒排索引作为兄弟TN-200将被索引为兄弟,TN和200,这就是为什么我预计word_delimiter使“tn”处于倒排索引。如果我使用edgeNGram,它没有用处吗? -
是的,我知道它应该是2,但我更喜欢3,因为我不希望如果任何其他产品包含“tn”应显示在结果列表中。例如关于“hp”。我正在为“惠普”购买产品,因为我的产品就像“hp xxx”,但我也得到了一种名为“tech hpc”的产品。我不希望这个产品被显示,直到我输入“hpc”。 – batmaci
另一方面,如果我不使用edgeNGram标记器,但只有word_delimiter,“tn”在倒排索引中。这就是为什么我期望word_delimiter使“tn”被索引。如果我使用edgeNGram,它没有用处吗? – batmaci
如果单词分隔符过滤器产生2个或更少的代码点的标记,则它们被'my-edge-ngram'忽略,就像忽略任何代号为2或更小的代码,如果单词分隔符不存在。另外我不明白为什么当你为产品“hp xxx”输入“hp”时会得到“hewlett packard”。 'my_edge_ngram'应该从倒排索引中删除“hp”,并且只有'hpc'将保留'curl -Xget“http:///_analyze?analyzer = my_analyzer&text = hp xxx”' –
keety