1

似乎如果我通过 ngram 过滤器运行一个单词或短语,则原始单词不会被索引。相反,我只得到不超过我的 max_gram 值的单词块。我希望原始单词也能被索引。我正在使用 Elasticsearch 0.20.5。如果我使用带有 ngram 的过滤器设置索引,如下所示:

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

我得到了很多克,但不是原来的词。我是否缺少使这项工作按我想要的方式进行的配置?

4

1 回答 1

3

如果您想保留完整的词组,请使用多字段映射来保留一个“未分析”的值,或者使用关键字标记器。

此外,在搜索具有 nGram 标记值的字段时,您可能还应该使用 nGram-tokenizer 进行搜索,然后 n 字符限制也适用于搜索短语,您将获得预期的结果。

于 2013-03-13T21:07:30.563 回答