当前位置:  开发笔记 > 前端 > 正文

ElasticSearch短语前缀搜索 - 如何获取匹配的短语?

如何解决《ElasticSearch短语前缀搜索-如何获取匹配的短语?》经验,为你挑选了0个好方法。

我正在使用ElasticSearch构建自动完成功能.当用户输入时,我想显示数据的完成列表,因此用户可以选择一个.例如,如果数据包含以下短语:

very unusual
very unlikely
very useful

和用户类型:

very u

我想显示上面的短语.

我正在使用此查询:

  "query": {
    "multi_match": {
      "query": "very u",
      "fields": [
        "name",
        "description",
        "contentBlocks.caption",
        "contentBlocks.text"
      ],
      "type": "phrase_prefix",
      "max_expansions": 10,
      "cutoff_frequency": 0.001
    }

这与我正在寻找的内容相匹配,但从搜索结果中提取匹配的短语非常尴尬.我一直在使用突出显示,我通过解析突出显示来收集匹配的短语.例如:

    "highlight": {
      "contentBlocks.text": [
        "turned the very unusual doorknob"
      ]
    }

    "highlight": {
      "contentBlocks.text": [
        "invented a very useful mechanism"
      ]
    }

这样做的正确方法是什么?


"Phrase Suggester"可能能够完成我所描述的内容,但你怎么做到这一点并不明显.

我已将感兴趣的字段(例如"描述")编入索引,如下所示:

  "description" : {
    "index_analyzer" : "snowball_stem",
    "search_analyzer" : "snowball_stem",
    "type" : "string",
    "fields" : {
      "autocomplete" : {
        "index_analyzer" : "shingle_analyzer",
        "search_analyzer" : "shingle_analyzer",
        "type" : "string"
      }
    }
  },

我使用snowball_stem分析器进行搜索,使用shingle_analyzer进行自动完成功能.shingle_analyzer看起来像这样:

"settings" : {
    "analysis" : {
        "analyzer" : {
            "shingle_analyzer" : {
                "type" : "custom",
                "tokenizer" : "standard",
                "filter" : [
                    "standard",
                    "lowercase",
                    "shingle_filter"
                ],
                "char_filter" : [
                    "html_strip"
                ]
            }
        },
        "filter" : {
            "shingle_filter" : {
                "type" : "shingle",
                "min_shingle_size" : 2,
                "max_shingle_size" : 2
            }
        }
    }
},

短语建议的文档似乎完全面向"拼写纠正"而不是完成.因为我所完成的是完成,我将直接生成器的min_word_length和prefix_length设置为输入文本的长度,在本例中为2.

我根据文档制作了一个建议查询:

{
    "text" : "sa",
    "autocomplete_description" : {
        "phrase" : {
            "analyzer" : "standard",
            "field" : "description.autocomplete",
            "size" : 10,
            "max_errors" : 2,
            "confidence" : 0.0,
            "gram_size" : 2,
            "direct_generator" : [
                {
                    "field" : "description.autocomplete",
                    "suggest_mode" : "always",
                    "size" : 10,
                    "min_word_length" : 2,
                    "prefix_length" : 2
                }
            ]
        }
    }
}

搜索"sa"的建议会产生以下结果:

{
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "autocomplete_description" : [ {
    "text" : "sa",
    "offset" : 0,
    "length" : 2,
    "options" : [ {
      "text" : "say",
      "score" : 0.012580795
    }, {
      "text" : "sa",
      "score" : 0.01127677
    }, {
      "text" : "san",
      "score" : 0.0106529845
    }, {
      "text" : "sad",
      "score" : 0.008533429
    }, {
      "text" : "saw",
      "score" : 0.008107899
    }, {
      "text" : "sam",
      "score" : 0.007155634
    } ]
  } ]
}

我期望为输入"sa"找到的是以任何长度的"sa"开头的单词.为什么它只返回两个或三个字符的单词?为什么它只返回六个选项?我一直在使用的multi_match phrase_prefix查询找到了以"sa"开头的更长的单词,例如"save","sassy","safari"和"salad".

当我搜索多字文本的建议时,例如"一个或"(在数据中出现很多次),它什么也没找到.multi_match phrase_prefix查询找到"一个或多个","一个或","一个或你",以及"一个或两个".

我怎样才能让这个建议者做我想做的事情?

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有