ElasticSearch:带状疱疹 - 如果字段包含精确的木瓦标记,则匹配短语

时间:2016-10-20 04:49:17

标签: elasticsearch full-text-search shingles

我是弹性搜索的新手,遇到以下情况的麻烦:

  1. 我们认为我有2个文件,其中只包含一个字段" text"
    1. "文本" :" token1 token4"
    2. "文本" :" token2 token3"
    3. "文本" :" token4 token5"
  2. 并通过以下查询文本" token1 token2 token3 token4 token5"我只想找到文件2和3
  3. 我需要类似于带状疱疹过滤器的东西,它会从查询中创建以下标记:

    [" token1 token2"," token2 token3"," token3 token4"," token4 token5"]

    并且将通过这些令牌完全匹配,因此令牌"令牌2令牌3"和#34; token4 token5"将匹配文件

    提前致谢!

1 个答案:

答案 0 :(得分:2)

这可以通过使用shingle filter并使 output_unigrams false 来实现(它将阻止生成单个令牌)。像这样创建索引

PUT shingle_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "shingle_analyzer": {
          "tokenizer": "standard",
          "filter": [
            "shingle_filter",
            "lowercase"
          ]
        }
      },
      "filter": {
        "shingle_filter":{
          "type" : "shingle",
          "max_shingle_size" : 2,
          "min_shingle_size" : 2,
          "output_unigrams" : false,
          "output_unigrams_if_no_shingles" : true
        }
      }
    }
  },
  "mappings": {
    "mytype":{
      "properties": {
        "text" : {
          "type": "string",
          "analyzer": "shingle_analyzer"
        }
      }
    }
  }
}

索引一些示例文档。

POST /shingle_index/mytype/_bulk
{"index":{"_id":5}}
{"text":"token1 token4"}
{"index":{"_id":3}}
{"text":"token2 token3"}
{"index":{"_id":2}}
{"text":"token4 token5"}

然后简单的匹配查询将为您提供所需的结果。

GET shingle_index/_search
{
  "query": {
    "match": {
      "text": "token1 token2 token3 token4"
    }
  }
}