Elasticsearch匹配一个字符串数组

时间:2017-06-16 07:59:08

标签: elasticsearch

我的Elasticsearch(v5.4.1)文档有一个_patents字段:

{
    // (Other fields : title, text, date, etc.)
    ,
    "_patents": [
        {"cc": "US"},
        {"cc": "MX"},
        {"cc": "KR"},
        {"cc": "JP"},
        {"cc": "CN"},
        {"cc": "CA"},
        {"cc": "AU"},
        {"cc": "AR"}
    ]
}

我正在尝试构建一个只返回其专利与国家/地区代码数组匹配的文档的查询。 例如,如果我的过滤器为["US","AU"],则需要返回USAU中拥有专利的所有文档。排除包含US但不包含AU的文档。

到目前为止,我已尝试在当前工作查询中添加“term”字段:

{
    "query": {
        "bool": {
            "must": [
                // (Other conditions here : title match, text match, date range, etc.) These work
                 ,
                {
                    "terms": {
                        "_patents.cc": [ // I tried just "_patents"
                            "US",
                            "AU"
                        ]
                    }
                }
            ]
        }
    }
}

或者这个,作为过滤器:

{
    "query": {
        "bool": {
            "must": [...],
            "filter": {
                "terms": {
                    "_patents": [
                        "US",
                        "AU"
                    ]
                }
            }
        }
    }
}

这些查询和我尝试的变体不会产生错误,但会返回0结果。

我无法将我的ES文档模型更改为更容易匹配的内容,例如"_patents": [ "US","CA", "AU", "CN", "JP" ],因为这是一个填充的字段。在索引时,我填充并引用包含Patent字段的cc个文档。

3 个答案:

答案 0 :(得分:3)

这适用于大写和小写两种..

 {
  "query": {
    "bool": {
      "must": [ 
        {
          "match": {
            "_patents.cc": "au"
          }
        },
        {
          "match": {
            "_patents.cc": "us"
          }
        }
      ]
    }
  }
}

答案 1 :(得分:1)

我找到了解决方案。已过滤的国家/地区名称必须为小写 ...

function search(){ $this->dashboard(); $data['searches'] =array(); if ($query = $this->users_model->user_search($this->input->post('search'))) { $data['searches'] = $query; } $this->load->view('dashboard', $data); } 不会返回任何结果,但"US"仍有效,尽管索引字段为"us" ...... Faint -_-'

我也用这种方式编写了查询:

"US"

答案 2 :(得分:0)

我的elasticsearch版本是6.0.1。我正在使用这种方法:

GET <your index>/_search
{
  "query": {
    "bool": {
      "must": [{
        "query_string": {
          "query": "cc:us OR cc:ca"
        }
      }]
    }    
  }
}