elasticsearch - ElasticSearch 在搜索结果的末尾附加不匹配的文档
问题描述
有没有办法在搜索结果的末尾附加不匹配的文档?
我一直在做一个项目,我们需要按地理位置数据搜索文档,但有些文档没有可用的地理位置数据。因此,这些文档没有在搜索结果中返回。
有没有办法在搜索结果的末尾附加不匹配的文档?
示例映射:
PUT /my_locations
{
"mappings": {
"_doc": {
"properties": {
"address": {
"properties": {
"city": {
"type": "text"
},
"location": {
"type": "geo_point"
}
}
}
}
}
}
}
具有地理位置的数据:
PUT /my_locations/_doc/1
{
"address" : {
"city: "XYZ",
"location" : {
"lat" : 40.12,
"lon" : -71.34
}
}
}
没有地理位置的数据:
PUT /my_locations/_doc/2
{
"address" : {
"city: "ABC"
}
}
有没有办法执行地理距离查询,它将选择带有地理位置数据的文档并在结果末尾附加非地理文档?
解决方案
您有两个单独的查询
- 获取区域内的文件
- 获取其他文件
要在一次搜索中获得这两个,意味着所有文档都出现在一个结果中,并共享排名。很难创建一个相关性模型来获取前 9 个带有地址的文档,而一个没有地址的文档。
但是您可以一次运行两个查询,一个表示前 9 个带有位置的文档,一个表示没有任何位置。
例子:
GET my_locations/_msearch
{}
{"size":9,"query":{"geo_distance":{"distance":"200km","pin.location":{"lat":40,"lon":-70}}}}
{}
{"size":1,"query":{"bool":{"must_not":[{"exists":{"field":"pin.location"}}]}}}
推荐阅读
- sql - 如何在 SQL 中将 2 个 Varchar 字符串转换为 DateTime
- google-fabric - 未交付的分配
- php - 循环 mysql 表并从 api 抓取更新内容
- apache-spark - Spark drop 复制源代码
- sql - sql db2 与 1 个带有一些空值的表连接
- c - C - 多重定义 main() K&R eclipse
- rest - OTRS 通过 REST-API 创建工单后发送电子邮件
- javascript - 无法将文本格式的 API 响应导出到 CSV 文件
- ruby - 您的供应商/缓存目录中似乎缺少一些宝石
- python - 具有默认 NULL 值的列在 SELECT python pymysql 上返回为 (None,)