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吗?”

解决方法

@hansley答案是可行的,但是由于通配符查询的成本很高,因此您可以直接使用prefix query而无需更改索引中的任何内容。

尽管有多种方法可以在ES中实施Autosuggest,并考虑到其重要性和受欢迎程度,我还是写了detailed blog on various approaches and their trade-off,而我的this SO answer可以为您提供有关功能和非功能需求的信息,以构建自动建议功能。

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

默认索引映射,它将为每个文本字段创建一个.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","_id": "2","_source": {
          "title": "do you like physics?"
        }
      }
    ]
,

如果我对您的问题有很好的了解,我会为您提供建议的答案,供您使用。我将通配符查询与规范化器一起使用以小写所有值:

这是我的索引的映射:

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

我在索引中提取了以下数据:

“任务”:“你喜欢数学吗?”

“任务”:“你喜欢物理学吗?”

“任务”:“您喜欢历史吗?”

“任务”:“我想我喜欢你”

“任务”:“我喜欢红色汽车”

“任务”:“你不喜欢”

“任务”:“你喜欢数学吗?”

基于这些值,我创建了以下查询:

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","_id" : "cOe1e3QBsTCl1BZvD0Yh","_source" : {
      "quest" : "do you like physics?"
    }
  },"_id" : "cee1e3QBsTCl1BZvE0Zq","_source" : {
      "quest" : "do you like history?"
    }
  },"_id" : "2-e1e3QBsTCl1BZvLUak","_source" : {
      "quest" : "Do you like math?"
    }
  }
]

链接: https://www.elastic.co/guide/en/elasticsearch/reference/current/normalizer.html https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html

注意:但是,如果您使用通配符,则可能会影响性能

让我知道它是否对您有帮助,否则我们可以尝试其他解决方案,谢谢您。

,

我认为您的同义词含义错误。 您想要的是suggester。 您将要做一些具体的工作,但是您将能够为您的用例创建非常有力的建议。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...