首页 > 解决方案 > 具有变量值的 ElasticSearch 搜索结果

问题描述

我希望将 elasticsearch 用于具有自动完成功能的搜索栏。我有一组问题,它们有多个变量,我想用其他值代替。

一个问题的模板是:你喜欢FIELDS吗?将 FIELDS 替换为数学、物理、历史,然后在查询“你喜欢”这个问题时,它会显示多个命中:

我将 elasticseach 视为同义词分析器,并认为它可以用于这个用例,但它似乎不像我预期的那样工作。以下是我到目前为止所拥有的。

创建索引

{
        "mappings": {
            "properties": {
                "my_field": {
                    "type": "search_as_you_type",
                    "analyzer": "standard",
                    "search_analyzer": "synonym_analyzer"
                }
            }
        },
        "settings": {
            "index": {
                "analysis": {
                    "analyzer": {
                        "synonym_analyzer": {
                            "tokenizer": "whitespace",
                            "filter": ["my_synonyms"]
                        }
                    },
                    "filter": {
                        "my_synonyms": {
                            "type": "synonym",
                            "synonyms": [
                                "FIELDS => math, physics, history"
                            ]
                        }
                    }
                }
            }
        }
    }

询问

{
        "query": {
            "multi_match": {
                "query": partial_question,
                "type": "bool_prefix",
                "fields": [
                    "my_field",
                    "my_field._2gram",
                    "my_field._3gram",
                    "my_field._index_prefix"
                ]
            }
        }
    }

结果是一个结果“你喜欢FIELDS吗?”

标签: elasticsearchelasticsearch-queryelasticsearch-7

解决方案


@hansley 答案会起作用,但由于通配符查询成本很高,您可以简单地使用前缀查询而不更改索引中的任何内容。

尽管在 ES 中实现 Autosuggest 有多种方法,并且考虑到它的重要性和受欢迎程度,但我已经写了一篇关于各种方法及其权衡的详细博客,而且我的这个 SO 答案可以为您提供有关构建一个功能和非功能要求的信息自动建议功能。

使用前缀查询的端到端示例:

.keyword field默认索引映射,它为每个文本字段创建一个:

索引示例文档:

{
  "title" : "i like red car"
}

{
  "title" : "do you like math?"
}

{
  "title" : "do you like physics?"
}

搜索查询

{
  "query": {
    "prefix": {
      "title.keyword": {
        "value": "do you like"
      }
    }
  }
}

搜索结果

"hits": [
      {
        "_index": "partialpre",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.0,
        "_source": {
          "title": "do you like math?"
        }
      },
      {
        "_index": "partialpre",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.0,
        "_source": {
          "title": "do you like physics?"
        }
      }
    ]

推荐阅读