具有可变值的elasticsearch结果

rsaldnfx  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(3)|浏览(536)

我正在寻找一个搜索栏与自动完成功能使用ElasticSearch。我有一组问题,它们有多个变量,我想用其他值来代替。
一个问题的模板是:你喜欢字段吗?将字段替换为数学、物理、历史,然后在查询问题“do you like”时,将显示多个点击:
你喜欢数学吗?
你喜欢物理吗?
你喜欢历史吗?
我将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"
                ]
            }
        }
    }

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

ryoqjall

ryoqjall1#

如果我能很好地理解你的问题,我会给你一个建议性的答案。我使用通配符查询和规范化器来将所有值小写:
以下是我的索引Map:

PUT multiple-fields
{
  "settings": {
    "analysis": {
      "normalizer": {
        "lowercase_normalizer": {
          "type":"custom",
        "filter": ["lowercase"]
        }

      }
    }
  },
  "mappings": {
    "properties": {
      "quest":{
        "type": "keyword",
        "normalizer": "lowercase_normalizer"
      }
    }
  }
}

我在索引中摄取了以下数据:
“quest”:“你喜欢数学吗?”
“探索”:“你喜欢物理吗?”
“探索”:“你喜欢历史吗?”
“探索”:“我想我确实喜欢你”
“quest”:“我喜欢红色的车”
“quest”:“你不喜欢”
“quest”:“你喜欢数学吗?”
基于这些值,我创建了以下查询:

GET multiple-fields/_search
{
  "query": {
    "wildcard": {
      "quest": {
        "value": "do you like*"
      }
    }
  }
}

答复是:

"hits" : [
  {
    "_index" : "multiple-fields",
    "_type" : "_doc",
    "_id" : "bue1e3QBsTCl1BZvB0by",
    "_score" : 1.0,
    "_source" : {
      "quest" : "do you like math?"
    }
  },
  {
    "_index" : "multiple-fields",
    "_type" : "_doc",
    "_id" : "cOe1e3QBsTCl1BZvD0Yh",
    "_score" : 1.0,
    "_source" : {
      "quest" : "do you like physics?"
    }
  },
  {
    "_index" : "multiple-fields",
    "_type" : "_doc",
    "_id" : "cee1e3QBsTCl1BZvE0Zq",
    "_score" : 1.0,
    "_source" : {
      "quest" : "do you like history?"
    }
  },
  {
    "_index" : "multiple-fields",
    "_type" : "_doc",
    "_id" : "2-e1e3QBsTCl1BZvLUak",
    "_score" : 1.0,
    "_source" : {
      "quest" : "Do you like math?"
    }
  }
]

链接:https://www.elastic.co/guide/en/elasticsearch/reference/current/normalizer.htmlhttps://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html
注意:但是,如果使用通配符,可能会影响性能
让我知道如果它能帮助你,否则我们可以在另一个解决方案工作谢谢你。

nsc4cvqm

nsc4cvqm2#

我认为你用同义词看错了方向。你想要的是一个建议者。你将有一点具体的工作要做,但你将能够创建非常强大的建议,为您的用例。

iq0todco

iq0todco3#

@hansley answer可以工作,但由于通配符查询的成本很高,您可以简单地使用前缀查询,而无需更改索引中的任何内容。
尽管在es中实现autosuggest有多种方法,考虑到autosuggest的重要性和受欢迎程度,我已经写了一篇详细的博客,介绍了各种方法及其优缺点,我的这个答案可以为您提供有关构建autosuggest特性的功能性和非功能性需求的信息。
使用前缀查询的端到端示例:
默认索引Map,它创建 .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?"
        }
      }
    ]

相关问题