3

我是弹性搜索的新手,在以下情况下遇到问题:

  1. 假设我有 2 个文档,其中仅包含一个字段“文本”
    1. “文本”:“令牌 1 令牌 4”
    2. “文本”:“令牌 2 令牌 3”
    3. “文本”:“令牌 4 令牌 5”
  2. 通过以下查询文本“token1 token2 token3 token4 token5”,我只想找到文档 2 和 3

我需要类似于 shingles 过滤器的东西,它将从查询中创建以下标记:

[“token1 token2”,“token2 token3”,“token3 token4”,“token4 token5”]

并且将通过这些标记进行精确匹配,因此标记“token2 token3”和“token4 token5”将匹配文档

提前致谢!

4

1 回答 1

3

这可以通过使用shingle过滤器并使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"
    }
  }
}
于 2016-10-20T20:28:54.963 回答