ElasticSearch ngram edge_ngram

ngram, 类似一个向右移动的游标窗口, 把窗口中看到的部分内容进行索引. token_chars 默认包含所有字符, 如果设置为 letter, 则对每个词分别执行(不会出现跨词的窗口). 要求 max_grammin_gram 最多长一位.

edge_ngram 只从每个分段的边缘开始(不会出现词中的窗口). max_gram 可以比 min_gram长任意位.

例如, 当 min_gram =2, max_gram=3, "中华人民" 在两个 tokenizer 的分词情况如下:
ngram: 中华, 中华人, 华人, 华人民
edge_ngram: 中华, 中华人

DELETE /demo

PUT /demo
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_ngram_analyzer": {
          "type": "custom",
          "tokenizer": "my_ngram"
        },
        "my_edge_ngram_analyzer": {
          "type": "custom",
          "tokenizer": "my_edge_ngram"
        }
      },
      "tokenizer": {
        "my_ngram": {
          "type": "ngram",
          "min_gram": 2,
          "max_gram": 3,
          "token_chars": [
            "letter"
          ]
        },
        "my_edge_ngram": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 5,
          "token_chars": [
            "letter"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "s1": {
        "type": "text",
        "analyzer": "my_ngram_analyzer"
      },
      "s2": {
        "type": "text",
        "analyzer": "my_edge_ngram_analyzer"
      }
    }
  }
}

POST /demo/_doc/1
{
  "s1": "中华人民共和国 劳动法第一章第一节"
}

GET /demo/_analyze
{
  "field": "s1",
  "text": "中华人民共和国 劳动法第一章第一节"
}

POST /demo/_doc/2
{
  "s2": "中华人民共和国 劳动法第一章第一节"
}

GET /demo/_analyze
{
  "field": "s2",
  "text": "中华人民共和国 劳动法第一章第一节"
}

# only s1
GET /demo/_search
{
  "query": {
    "multi_match": {
      "query": "共和国",
      "fields": ["s1", "s2"]
    }
  }
}

# s1 and s2
GET /demo/_search
{
  "query": {
    "multi_match": {
      "query": "劳动法",
      "fields": ["s1", "s2"]
    }
  }
}

你可能感兴趣的:(ElasticSearch ngram edge_ngram)