Lucene 在Elasticsearch中,当我通过ngram过滤器运行一个单词时,为什么会丢失整个单词标记?
似乎如果我通过ngram过滤器运行一个单词或短语,原始单词不会被索引。取而代之的是,我只得到最大值的单词块。我希望原始单词也能被索引。我使用的是Elasticsearch 0.20.5。如果我使用带有Ngram的过滤器设置索引,如下所示:Lucene 在Elasticsearch中,当我通过ngram过滤器运行一个单词时,为什么会丢失整个单词标记?,lucene,elasticsearch,Lucene,elasticsearch,似乎如果我通过ngram过滤器运行一个单词或短语,原始单词不会被索引。取而代之的是,我只得到最大值的单词块。我希望原始单词也能被索引。我使用的是Elasticsearch 0.20.5。如果我使用带有Ngram的过滤器设置索引,如下所示: CURL -XPUT 'http://localhost:9200/test/' -d '{ "settings": { "analysis": { "filter": { "my
CURL -XPUT 'http://localhost:9200/test/' -d '{
"settings": {
"analysis": {
"filter": {
"my_ngram": {
"max_gram": 10,
"min_gram": 1,
"type": "nGram"
},
"my_stemmer": {
"type": "stemmer",
"name": "english"
}
},
"analyzer": {
"default_index": {
"filter": [
"standard",
"lowercase",
"asciifolding",
"my_ngram",
"my_stemmer"
],
"type": "custom",
"tokenizer": "standard"
},
"default_search": {
"filter": [
"standard",
"lowercase"
],
"type": "custom",
"tokenizer": "standard"
}
}
}
}
}'
然后我在一份文件中放了一个长单词:
CURL -XPUT 'http://localhost:9200/test/item/1' -d '{
"foo" : "REALLY_REALLY_LONG_WORD"
}'
我想问一下这个长词:
CURL -XGET 'http://localhost:9200/test/item/_search' -d '{
"query":
{
"match" : {
"foo" : "REALLY_REALLY_LONG_WORD"
}
}
}'
我得到0个结果。如果我查询该单词的10个字符块,我确实会得到一个结果。当我运行此命令时:
curl -XGET 'localhost:9200/test/_analyze?text=REALLY_REALLY_LONG_WORD
我得到了很多克,但不是原来的单词。我是否缺少使其按我所希望的方式工作的配置?如果您希望保留完整的单词短语,请对保留一个“未分析”的值使用多字段映射,或者使用关键字标记器
此外,当使用nGram标记值搜索字段时,您可能还应该使用nGram标记器进行搜索,然后n字符限制也将应用于搜索短语,您将得到预期的结果。我有同样的问题,这些解决方案并不能完全解决我的问题:(1)映射到两个字段迫使每个字段每次搜索都指定对这两个字段的搜索,例如,
name:linus或name2:linus
(2)为查询启用nGram标记器会导致搜索结果中出现大量误报(例如,我对“叙词表”的搜索将匹配任何包含“the”的内容)