Elasticsearch:基于仅在两个映射之一上定义的属性进行过滤

时间:2017-09-28 17:40:14

标签: elasticsearch

我有两个索引pagesevents都使用简单的搜索查询进行搜索:

示例查询:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "siteHandle": "testing"
          }
        },
        {
          "simple_query_string": {
            "query": "Test New Event",
            "fields": [
              "Name^3",
              "evName^3",
              "Description^2",
              "evDescription^2",
              "_all"
            ]
          }
        }
      ]
    }
  }
}

映射看起来像这样:

events

{
  "events": {
    "properties": {
      "evDescription": {
        "type": "text"
      },
      "evName": {
        "type": "text"
      },
      "siteHandle": {
        "type": "keyword"
      },
      "startTime": {
        "type": "integer"
      }
    }
  }
}

pages

{
  "pages": {
    "properties": {
      "cName": {
        "type": "text"
      },
      "cPath": {
        "type": "keyword"
      },
      "content": {
        "type": "text"
      },
      "siteHandle": {
        "type": "keyword"
      }
    }
  }
}

我需要过滤掉比现在少startTime的事件,但我不确定如何在不过滤掉所有pages的情况下执行此操作。

问:我如何使用此查询同时搜索eventspages,同时仅过滤events比现在少startTime的{​​{1}}?

1 个答案:

答案 0 :(得分:1)

你需要添加另一个句子来说" startTime字段丢失或者startTime少于现在"。

There is no missing query,因此您可以结合使用bool查询 must_not 存在查询。看起来应该是这样的:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": { ... }
        },
        {
          "simple_query_string": { ... }
        },
        {
          "bool": {
            "should": [
              {
                "bool": {
                  "must_not": {
                    "exists": {
                      "field": "startTime"
                    }
                  }
                }
              },
              {
                "range": {
                  "startTime": {
                    "lt": "now"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}