我的索引中有两个文档(相同类型):

{
    "first_name":"John",
    "last_name":"Doe",
    "age":"24",
    "phone_numbers":[
        {
            "contract_number":"123456789",
            "phone_number":"987654321",
            "creation_date": ...
        },
        {
            "contract_number":"123456789",
            "phone_number":"012012012",
            "creation_date": ...
        }
    ]
}

{
    "first_name":"Roger",
    "last_name":"Waters",
    "age":"36",
    "phone_numbers":[
        {
            "contract_number":"546987224",
            "phone_number":"987654321",
            "creation_date": ...,
            "expired":true
        },
        {
            "contract_number":"87878787",
            "phone_number":"55555555",
            "creation_date": ...
        }
    ]
}

客户希望执行全文本搜索。好的,这没问题

我的问题 :
在此全文搜索中,有时是用户将通过 phone_number 进行搜索。在这种情况下,有一个参数expired=true

范例:
第一个客户端搜索请求:缺少"987654321"expired或设置为false
->结果:仅第一个文档

第二个客户端搜索请求:"987654321",且expired设置为true
->结果:两个文件

我该如何实现?

这是我的映射:
{
"user": {
    "_all": {
        "auto_boost": true,
        "omit_norms": true
    },
    "properties": {
        "phone_numbers": {
            "type": "nested",
            "properties": {
                "phone_number": {
                    "type": "string"
                },
                "creation_date": {
                    "type": "string",
                    "index": "no"
                },
                "contract_number": {
                    "type": "string"
                },
                "expired": {
                    "type": "boolean"
                }
            }
        },
        "first_name":{
            "type": "string"
        },
        "last_name":{
            "type": "string"
        },
        "age":{
            "type": "string"
        }
    }
}

}

谢谢 !

MC

编辑:

我试过这个查询:
{
"query": {
    "filtered": {
        "query": {
            "query_string": {
                "query": "987654321",
                "analyze_wildcard": "true"
            }
        },
        "filter": {
            "nested": {
                "path": "phone_numbers",
                "filter": {
                    "bool": {
                        "should":[
                           {
                             "bool": {
                                "must": [
                                  {
                                    "term": {
                                        "phone_number": "987654321"
                                    }
                                },
                                {
                                    "missing": {
                                        "field": "expired"
                                    }
                                }
                              ]
                            }
                          },
                          {
                            "bool": {
                                "must_not": [
                                    {
                                        "term": {
                                            "phone_number": "987654321"
                                        }
                                    }
                                ]
                            }
                         }
                        ]
                    }
                }
             }
        }
    }
}}

但是我得到了两个文档而不是,只得到了第一个

最佳答案

你很亲密尝试结合使用mustshould,其中must子句确保phone_number与搜索值匹配,而should子句确保缺少expired字段或将其设置为false。例如:

{
  "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "987654321",
          "analyze_wildcard": "true"
        }
      },
      "filter": {
        "nested": {
          "path": "phone_numbers",
          "query": {
            "filtered": {
              "filter": {
                "bool": {
                  "must": [
                    {
                      "term": {
                        "phone_number": "987654321"
                      }
                    }
                  ],
                  "should": [
                    {
                      "missing": {
                        "field": "expired"
                      }
                    },
                    {
                      "term": {
                        "expired": false
                      }
                    }
                  ]
                }
              }
            }
          }
        }
      }
    }
  }
}

我使用您的映射和样本文档运行了该查询,并且按预期方式返回了John Doe的一个文档。

09-19 23:30