【发布时间】:2020-09-12 07:04:54
【问题描述】:
我在弹性搜索索引/集群中有以下文档
[
{id: 1, firstName: 'User', lastName: 'John', nickName: 'Smith'},
{id: 2, firstName: 'Test', lastName: 'John', nickName: 'Andrew'},
{id: 3, firstName: 'Test', lastName: 'Zch', nickName: 'John'},
{id: 4, firstName: 'Test', lastName: 'Mason', nickName: 'John'},
{id: 5, firstName: 'John', lastName: 'Doe'},
//should not search this
{id: 6, firstName: 'John', lastName: 'Glow', nickName: 'NonSearchText'}
];
我的搜索要求类似于移动设备中的联系人搜索:
相关搜索应首先使用 nickName,然后是 lastName。如果 nickName 不存在,那么它应该按照 ASC 排序顺序搜索 firstName
搜索文字:约翰
因此查询搜索结果应该是
[
// search with nickName as higher relevance and then sorted it
{id: 4, firstName: 'Test', lastName: 'Mason', nickName: 'John'},
{id: 3, firstName: 'Test', lastName: 'Zch', nickName: 'John'},
// search with lastName as second higher relevance and then sorted it
{id: 2, firstName: 'Test', lastName: 'John', nickName: 'Andrew'},
{id: 1, firstName: 'User', lastName: 'John', nickName: 'Smith'},
// search with firstName as nickName is null
{id: 5, firstName: 'John', lastName: 'Doe'},
// and omitted one record
];
查询写入:
{
"sort" : [
{"lastName.keyword": "asc"},
{"nickName.keyword": "asc"}
],
"query": {
"bool": {
"must": [{
"query_string": {
"query": "John*",
"analyze_wildcard": "true",
"fields": ["nickName^3", "lastName^2"]
}
}]
}
}
}
我无法涵盖以下场景:
- 如果存在 nickName 并且即使 firstName 与搜索文本匹配,则基于条件的搜索也不应该在搜索中包含该文档
- 如果昵称不存在,则按名字搜索
感谢任何帮助。
【问题讨论】:
标签: elasticsearch elasticsearch-dsl