ElasticSearch具有可变值的搜索结果

如何解决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。 您将要做一些具体的工作,但是您将能够为您的用例创建非常有力的建议。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?