elasticsearch - 如何使用正则表达式在elasticsearch中通过match_phrase查询搜索子对象的值字段
问题描述
Elasticseach 中层次结构的文档如下
"hierarchy":{
"username":"Nothing on",
"Location":"",
"Owner":"unknown",
"works": "IT"
}
是否有任何方法可以使用层次结构中的任何字段搜索值,层次结构中的字段是动态的,并尝试使用正则表达式模式匹配并出现错误。
我们不能像 hierarchy.works、hierarchy.Owner等那样指定。因为层次结构中的字段是动态的并且也使用了转义字符串,但它也会给出错误。
{
"from": 0,
"query": {
"multi_match": {
"query": "IT",
"type": "phrase_prefix",
"fields": [
"number",
"name",
"address",
"hierarchy.*.",
"tags"
],
}
}
}
解决方案
如果未提供任何字段,则 multi_match 查询默认为 index.query.default_field 索引设置,而后者又默认为 *。这将提取映射中符合术语查询条件的所有字段并过滤元数据字段。然后组合所有提取的字段以构建查询。
由于该hierarchy
字段是动态的,因此您无法指定要查询的字段,因此查询查询的一种方法是在field
参数中不添加任何字段。
索引数据1:
{
"hierarchy": {
"username": "Nothing on",
"Location": "",
"Owner": "unknown",
"works": "IT",
"education":"btech"
}
}
索引数据2:
{
"hierarchy": {
"username": "Nothing on",
"Location": "",
"Owner": "unknown",
"works": "IT"
}
}
搜索查询:
{
"query": {
"multi_match": {
"query": "btech",
"type": "phrase_prefix"
}
}
}
搜索结果:
"hits": [
{
"_index": "64467424",
"_type": "_doc",
"_id": "2",
"_score": 0.2876821,
"_source": {
"hierarchy": {
"username": "Nothing on",
"Location": "",
"Owner": "unknown",
"works": "IT",
"education": "btech"
}
}
}
]
编辑1:
您可以使用 query_string 查询创建包含通配符、跨多个字段的搜索等的复杂搜索。虽然通用,但查询很严格,如果查询字符串包含任何无效语法,则会返回错误。
{
"query": {
"query_string": {
"fields": [
"number",
"name",
"address",
"hierarchy*",
"tags"
],
"query": "btech"
}
}
}
推荐阅读
- vim - 为 gggqG 创建 vim 函数或映射
- python - 二分搜索算法测试重复值
- php - 导出到 CSV CP1252 West 编码法语重音字符不转换
- javascript - 为什么在我的项目中保存文件后反应应用程序会重新加载?
- gem5 - 如何访问 gem5 线程统计信息?
- vue.js - 如何确定 Vue.js + Vuetify 组件大小
- azure - Azure Powershell - 使用 SAS 令牌从 Azure 表中读取所有行(只读)
- javascript - 不同颜色的chartjs折线图点
- java - JavaFX:Java.Lang.ClassNotFoundException(即使场景构建器找到控制器)
- azure-logic-apps - Azure Logic app is failing when Null values in previous step