【问题标题】:Elasticsearch multi fields multi words matchElasticsearch 多字段多词匹配
【发布时间】:2020-02-19 17:23:19
【问题描述】:

我希望使用 elasticsearch 在我的应用上实现类似自动完成的功能。

假设我的输入是"ronan f",我希望弹性返回姓氏或名字中包含"ronan""f" 的所有元素。我希望 elasticsearch 按排名对结果进行排序,因此最接近我搜索的元素应该位于顶部。

我尝试了多个请求,但没有一个达到预期效果。

例如:

{
  "query": {
    "bool": {
        "must_not": [
            {
                "match": {
                    "email": "*@guest.booking.com"
                }
            }
        ],
        "should": [
            {
                "match": {
                    "lastname": "ronan"
                }
            },
            {
                "match": {
                    "firstname": "ronan"
                }
            },
            {
                "match": {
                    "lastname": "f"
                }
            },
            {
                "match": {
                    "firstname": "f"
                }
            }
        ],
        "minimum_should_match" : 1
    }
  },
  "sort": [
    "_score"
  ],
  "from": 0,
  "size": 30
}

有了这个请求,队伍就有点奇怪了,例如:

"_index": "clients",
"_type": "client",
"_id": "4369",
"_score": 20.680058,
"_source": {
   "firstname": "F",
   "lastname": "F"
 }

位于:

之上
"_index": "clients",
"_type": "client",
"_id": "212360",
_score": 9.230003,
"_source": {
   "firstname": "Ronan",
   "lastname": "Fily"
}

对我来说,第二个结果应该比第一个有更好的排名。

谁能告诉我怎样才能达到我想要的结果?

关于信息,我无法使用 elasticsearch 的 Completion Suggester 功能,因为我无法访问数据库的配置(因此没有索引)。

【问题讨论】:

  • 如果我们共享分析仪,您能否重新索引您的数据?
  • 可能是的。如果我理解正确,elasticsearch 提供了创建多个分析器的可能性,这些分析器可以作为参数传递给查询,每个分析器都可以影响查询的结果。抱歉,这就像我使用 elasticsearch 的前 2 天,我需要找到一些学习教程。
  • @toto1911,你能解决这个问题吗?还是还在寻找答案?
  • 是的,我设法在不使用新分析器的情况下优化我的请求,我将关闭帖子

标签: elasticsearch autocomplete elasticsearch-query


【解决方案1】:

好的,因为您可以重新索引您的数据,所以我加入了“开始于”anylyzer。它可以在无大小写和文本字段上工作(我认为名字和姓氏可以有多个单词)。

使用映射删除/创建新索引。

定义你的分析器(PUT my_index) { “设置”:{:

"filter": {
        "name_ngrams": {
            "max_gram": "20",
            "type": "edgeNGram",
            "min_gram": "1",
            "side": "front"
        }
    },
    "analyzer": {
        "partial_name": {
            "type": "custom",
            "filter": [
                "lowercase"
                ,
                "name_ngrams"
                ,
                "standard"
                ,
                "asciifolding"
            ],
            "tokenizer": "standard"
        },
        "full_name": {
            "type": "custom",
            "filter": [
                "standard"
                ,
                "lowercase"
                ,
                "asciifolding"
            ],
            "tokenizer": "standard"
        }
    }

使用此为您的字段发布_mappings:

"lastname": {
        "type": "text",
        "analyzer": "partial_name",
        "search_analyzer": "full_name"

},

    "firstname": {
        "type": "text",
        "analyzer": "partial_name",
        "search_analyzer": "full_name"
}

如果不清楚,并且 elasticsearch 文档无法帮助您,请不要犹豫询问我们。

【讨论】:

    猜你喜欢
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    相关资源
    最近更新 更多