如何将弹性搜索中的短语与可扩展前缀和后缀匹配?

时间:2017-05-03 10:46:52

标签: elasticsearch elasticsearch-2.0 elasticsearch-5

我们有一个用例,我们希望在弹性搜索中匹配短语,但除了短语查询,我们还想搜索部分短语。

示例:

搜索词组:"欢迎您"或者"得到你"或者"欢迎哟"或者" l哟"这应该与包含短语的文档匹配:

"欢迎你"

"我们欢迎你"

"欢迎您来到"

"我们欢迎您加入"

即。我们希望通过使用添加的功能执行短语查询来维护单词的排序,该查询返回包含短语作为部分子字符串并且前缀和后缀可扩展到某个可配置长度的结果。 在弹性方面我找到了类似的东西match_phrase_prefix'但它只匹配以特定前缀开头的短语。

Ex返回以d前缀开头的结果:

$ curl -XGET localhost:9200/startswith/test/_search?pretty -d '{
    "query": {
        "match_phrase_prefix": {
            "title": {
                "query": "d",
                "max_expansions": 5
            }
        }
    }
}'

我有什么办法可以为后缀实现这个目的吗?

1 个答案:

答案 0 :(得分:1)

我强烈建议您查看shingle token filter

您可以使用自定义分析器定义索引,该分析器利用带状符以便除了令牌本身之外还将一组后续令牌编入索引。

curl -XPUT localhost:9200/startswith -d '{
  "settings": {
      "analysis": {
        "analyzer": {
          "my_shingles": {
            "tokenizer": "standard",
            "filter": [
              "lowercase",
              "shingles"
            ]
          }
        },
        "filter": {
          "shingles": {
            "type": "shingle",
            "min_shingle_size": 2,
            "max_shingle_size": 2,
            "output_unigrams": true
          }
        }
      }
  },
  "mappings": {
    "test": {
      "properties": {
        "title": {
          "type": "text",
          "analyzer": "my_shingles"
        }
      }
    }
  }
}'

例如,we welcome you to将被索引为以下标记

  • we
  • we welcome
  • welcome
  • welcome you
  • you
  • you to
  • to

然后您可以索引一些示例文档:

curl -XPUT localhost:9200/startswith/test/_bulk -d '
{"index": {}}
{"title": "welcome you"}
{"index": {}}
{"title": "we welcome you"}
{"index": {}}
{"title": "welcome you to"}
{"index": {}}
{"title": "we welcome you to"}
'

最后,您可以运行以下查询以匹配上述所有四个文档,如下所示:

curl -XPOST localhost:9200/startswith/test/_search -d '{
   "query": {
       "match": {"title": "welcome you"}
   }
}'

请注意,此方法比match_phrase_prefix查询更强大,因为它允许您在文本正文的任何​​位置匹配后续标记,无论是在开头还是结尾。