elasticsearch - 弹性搜索 , And 运算符 , 嵌套字段
问题描述
我有一个文件,例如 { "name": "abc", "age": "20", "attributes": [{ "city": "NEW YORK" }, { "city": "NEW JERSEY" } ] }
如果我使用 YORK JERSEY 搜索,我希望查询返回 NO 记录。我使用了“and”运算符,但它不起作用,因为我在同一个字段而不是多个字段上搜索,因为 york 和 jersey 在这两个地方都存在,它给了我 2 条记录,有什么想法吗?而且我还阅读了有关嵌套字段的信息,但它需要重新索引数据,所以有没有重新索引数据的解决方案?
解决方案
对象数组不会像您期望的那样工作:您不能独立于数组中的其他对象查询每个对象。如果您需要能够做到这一点,那么您应该使用嵌套数据类型而不是对象数据类型。
详细解释请参考这篇关于Arrays的ES官方文档,请参考this SO answer。
添加具有索引数据、映射、搜索查询和搜索结果的工作示例
应用嵌套数据类型后,您必须重新索引数据
索引映射:
{
"mappings":{
"properties":{
"attributes":{
"type":"nested"
}
}
}
}
指数数据:
{
"name": "abc",
"age": "20",
"attributes": [
{
"city": "NEW YORK"
},
{
"city": "NEW JERSEY"
}
]
}
搜索查询:
{
"query": {
"nested": {
"path": "attributes",
"query": {
"bool": {
"must": [
{
"match": {
"attributes.city": "YORK"
}
},
{
"match": {
"attributes.city": "JERSEY"
}
}
]
}
},
"inner_hits": {}
}
}
}
搜索结果:
不返回结果
推荐阅读
- reactjs - 来自 AntDesign 表单的验证不适用于 onChange
- c++ - REDHAWK IDE 生成的端口类型 frontend::OutDigitalScanningTunerPort 在哪里定义?
- node.js - 在 Firebase 中处理大量数据或如何避免“在哪里”限制?
- flutter - 如何删除文本字段中图标和文本之间的间距 - Flutter?
- sas - 如何计算分类数据的 95% 置信区间(每日、偶尔、从不)
- oracle-apex - 使用 APEX_ERROR.ADD_ERROR 与 RAISE_APPLICATION_ERROR
- c++ - 仿函数是否等同于构造函数和方法?
- sql - Entity Framework Core:生成实体的“创建”和“更新”脚本
- c# - 在解决方案中为 C++ 项目创建 VSIX 扩展
- c - 如何在 VLFeat 中计算 MSER 椭球上的 SIFT 描述符?