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 文档无法帮助您,请随时询问我们。
我希望使用 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 文档无法帮助您,请随时询问我们。