【问题标题】:creating elastic search query创建弹性搜索查询
【发布时间】:2018-07-25 12:06:46
【问题描述】:

我的 elasticsearch 中有这个 json 文档:

{
  "personId": "5b564b6a0c000b622a55",
  "name": "Jake Harper",
  "country": "US",
  "socialSecurityNumber": 7634904,
  "personAddress": {
    "city": "Los Angeles",
    "street": "Sunset BLVD",
    "streetNumber": 149,
  },
  "additionalAddresses": [
    {
      "addressType": "office",
      "additionalAddress": {
        "city": "Santa Monica",
        "street": "3rd street",
        "streetNumber": 13
      }
    },
    {
      "addressType": "property",
      "additionalAddress": {
        "city": "mxkwUcc branch city",
        "street": "mxkwUcc BLVD",
        "streetNumber": 255
      }
    }
  ]
}

我想创建一个弹性查询,通过以下方式帮助我找到人:

personId
socialSecurityNumber
personAddress(all fields)
additionalAddresses(all fields in th array docs)

我在使用personAddressadditionalAddresses 创建查询时遇到了麻烦... 谁能在这里给我一些方向..?谢谢!

目前我的查询看起来像:

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "personId": "5b564b6a0c000b622a"
          }
        },
        {
          "match": {
            "name": "Harper"
          }
        }
      ]
    }
  }
}

我正在使用多个查询,因为我会得到一个术语输入,我想检查它是否属于上述任何字段。

我的映射:

{
  "peopledb": {
    "mappings": {
      "person": {
        "properties": {
          "additionalAddresses": {
            "properties": {
              "additionalAddress": {
                "properties": {
                  "city": {
                    "type": "text",
                    "fields": {
                      "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                      }
                    }
                  },
                  "street": {
                    "type": "text",
                    "fields": {
                      "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                      }
                    }
                  },
                  "streetNumber": {
                    "type": "long"
                  },
                  "zipCode": {
                    "type": "long"
                  }
                }
              },
              "addressType": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              }
            }
          },
          "country": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "personAddress": {
            "properties": {
              "city": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "street": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "streetNumber": {
                "type": "long"
              },
              "zipCode": {
                "type": "long"
              }
            }
          },
          "personId": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

【问题讨论】:

  • 您能否通过查询显示您当前所处的位置?
  • @Val 当然,完成 :) 编辑了问题
  • 您是否尝试过添加更多的 should 约束?
  • @Val 但是 personAddress 是一个复杂对象,而 AdditionalAddresses 是一个复杂对象的数组……难道没有不同的写法吗?
  • 你想从这些对象中查询什么?

标签: elasticsearch elasticsearch-5 elastic4s


【解决方案1】:

您可能需要将additionalAddresses 设为嵌套类型,但首先让我们看看multi_match 是否能让您更进一步:

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "personId": "5b564b6a0c000b622a"
          }
        },
        {
          "match": {
            "name": "Harper"
          }
        },
        {
          "match": {
            "personAddress.city": "Los"
          }
        },
        {
          "multi_match": {
            "fields": ["additionalAddresses.additionalAddress.city", "additionalAddresses.additionalAddress.street", "additionalAddresses.additionalAddress.streetNumber"],
            "query": "123 Main Street"
          }
        }
      ]
    }
  }
}

【讨论】:

  • 它不起作用,我可以单独使用 multi_match。也许你不能把它们结合起来?另外,我期待“竖琴”会给我带有“哈珀”的文档……为什么现在不行?我必须写 Harper 来获取包含 Harper 名字的文档,如果只有 Harp 这个词,我希望能够得到它们......
  • 要匹配前缀,您需要使用prefix 查询而不是match
  • 你能分享你的映射吗?
  • 当然,更新了问题并添加了映射。您可以编辑查询以使用前缀吗?基本上我想要一些非常简单的东西:我将从客户端收到一个术语,他们可能会发送部分术语,我想在字段 personId、name、personAddress 中查找包含该术语(或部分术语)的文档(所有字段),additionalAddresses(所有字段)。就这些
  • 只需将match 替换为prefix
猜你喜欢
  • 2015-07-17
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
相关资源
最近更新 更多