如何解决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 举报,一经查实,本站将立刻删除。