Elasticsearch多字段多词匹配

Elasticsearch multi fields multi words match

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

假设我的输入是 "ronan f",我希望对 return 姓氏或名字中包含 "ronan""f" 的所有元素进行弹性处理。我希望elasticsearch按排名对结果进行排序,因此与我搜索的内容最接近的元素应该在最前面。

我尝试了多个请求,但其中 none 个结果符合预期。

例如:

{
  "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 功能,因为我无法访问数据库的配置(因此没有索引)。

好的,因为你可以重新索引你的数据,我加入了一个 "start with" 分析器。它可以在文本字段上无大小写地工作(我认为名字和姓氏可以有多个单词)。

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

定义你的分析器(PUT my_index) { "settings": {:

"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"
        }
    }

post _mappings 将此用于您的字段:

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

},

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

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