我正在使用弹性搜索来寻找城市中的人。所以我有属性firstname
,lastname
和city
。
例如,可能的搜索词是“Charlotte Renee Tucker”,它应该返回以下人员:{firstname: "Charlotte Renee", lastname: "Tucker", city: "New York"}
或{firstname: "Renee", lastname: "Tucker", city: "Charlotte"}
,但不是{firstname: "Charlotte", lastname: "Tucker", city: "New Orleans"}
。
因此,所有术语都必须出现在某个领域。在最后一个示例中,单词“Renee”不是结果的一部分,因此不应返回。如果只在一个属性中找到所有单词是可以的,例如,如果您的名字是“Charlotte Renee Tucker”,则它是有效的搜索结果。我的查询目前如下所示:
{
"bool": {
"should": [
{
"match": {
"lastname": {
"query": "Charlotte Renee Tucker",
"operator": "OR"
}
}
},
{
"match": {
"firstname": {
"query": "Charlotte Renee Tucker",
"operator": "OR"
}
}
},
{
"match": {
"city": {
"query": "Charlotte Renee Tucker",
"operator": "OR"
}
}
}
]
}
}
但这也会返回只有一个词与某些属性匹配的人。我已经使用过该minimum_should_match
参数,但是如果仅在一个属性中找到所有单词,这将不起作用。有人可以帮忙吗?
这是我的映射:
{
"people": {
"mappings": {
"properties": {
"city": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"firstname": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"lastname": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
我添加了以下文件:
{"firstname": "Charlotte Renee", "lastname": "Tucker", "city": "New York"}
{"firstname": "Renee", "lastname": "Tucker", "city": "Charlotte"}
{"firstname": "Charlotte", "lastname": "Tucker", "city": "New Orleans"}
通过上述查询可以找到所有文档,但我不希望找到最后一个文档,因为它不包含“Renee”一词。