在 Mapping 里面,将 dynamic 参数设置成 strict 可以拒绝索引包含未知字段的文档。 此条 Tips 由 medcl 贡献。

使用ngram分词的问题?

Elasticsearch | 作者 poka | 发布于2023年02月08日 | 阅读数:4973

在elasticsearch 8.3版本中声明以下索引:
PUT analyzer_test
{
  "settings": {
    "index": {
      "max_ngram_diff": "30"
    },
    "analysis": {
        "analyzer": {
          "ngram_analyzer": {
            "tokenizer": "ngram_tokenizer"
          }
        },
        "filter": [
            "lowercase"
          ],
        "tokenizer": {
          "ngram_tokenizer": {
            "token_chars": [
              "letter",
              "digit"
            ],
            "min_gram": "1",
            "max_gram": "30",
            "type": "ngram"
          }
        }
      }
  }, 
  "mappings": {
    "properties": {
      "message": {
            "type": "text",
            "fields": {
                "keyword": {
                    "type": "keyword",
                    "ignore_above": 20
                }
            },
        "analyzer": "ngram_analyzer",
        "search_analyzer": "standard"
     }
    }
  }
}

插入一条数据,
POST analyzer_test/_doc/1
{
  "message":"DM2860"
}

进行match查询:
 
GET analyzer_test/_search
{
  "query": {
    "match": {
      "message": "2860"
    }
  }
}
可以返回数据,
 
但以下查询为什么查不到数据?
GET analyzer_test/_search
{
  "query": {
    "match": {
      "message": "DM2860"
    }
  }
}

GET analyzer_test/_search
{
  "query": {
    "match": {
      "message": "DM"
    }
  }
}
 
 
已邀请:

charlesfang

赞同来自:

内置的standard是会处理成小写的,你配置的ngram_analyzer得也加上小写filter
"ngram_analyzer": {
            "tokenizer": "ngram_tokenizer",
            "filter": "lowercase"
          }

要回复问题请先登录注册