Elasticsearc - nGram过滤器保留/保留原始令牌

时间:2016-07-12 13:08:35

标签: elasticsearch n-gram

我正在将ngram-filter应用于我的字符串字段:

"custom_ngram": {
    "type": "ngram",
    "min_gram": 3,
    "max_gram": 10
}

但结果是松散的标记比ngram范围更短或更长。

原始令牌,如" iq"或" a4"例如找不到。

我已经在ngram之前应用了一些语言特定的分析,所以我想避免复制整个字段。我希望用ngrams扩展令牌。

有任何想法或建议?

以下是我的一个使用custom_ngram过滤器的分析器的示例:

"french": {
    "type":"custom",
    "tokenizer": "standard",
    "filter": [
        "french_elision",
        "lowercase",
        "french_stop",
        "custom_ascii_folding",
        "french_stemmer",
        "custom_ngram"
    ]
}

2 个答案:

答案 0 :(得分:1)

除了使用多个字段并使用能够保留较短项的不同分析器索引该字段之外别无选择。这样的事情:

    "text": {
      "type": "string",
      "analyzer": "french",
      "fields": {
        "standard_version": {
          "type": "string",
          "analyzer": "standard"
        }
      }
    }

并调整查询以同时触摸text.standard_version字段。

答案 1 :(得分:0)

正如 Andrei Stefan 指出的那样,我不得不使用multi_fields。

我做了,我的映射(法语)现在看起来像这样:

                "french_strings": {
                    "match": "*_fr",
                    "match_mapping_type": "string",
                    "mapping": {
                        "type": "string",
                        "analyzer": "french",
                        "fields":{
                            "ngram":{
                                "type":"string",
                                "index":"analyzed",
                                "analyzer":"ngram",
                                "search_analyzer": "default_search"
                            }
                        }
                    }
                }

我决定从法语分析器中删除ngram过滤器,并为子域 .ngram 使用“自定义ngram-only”分析器。 这导致法语分析字段和“原始到ngram”子字段。