Elasticsearch匹配字符串数组

9

我的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" ]这样的字段。因为这是一个已填充的字段。在索引时,我填充并引用了包含许多字段(包括cc)的专利文档。
3个回答

11

我找到了解决方案。过滤后的国家名称必须是小写...

"US"没有结果,但是"us"有效,尽管索引字段是"US" ......感叹 -_-'

我也这样编写了查询:

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "_patents.cc": "us"
          }
        },
        {
          "term": {
            "_patents.cc": "ca"
          }
        }
      ]
    }
  }
}  

我无法弄清楚为什么针对一个整数数组的查询工作正常,但针对一个字符串数组却返回0个结果。当使用“term/terms”时似乎是正确的,但使用“query”时不是。我猜这是为了方便精确匹配,但为什么不转换查询呢?显然我错过了什么。 - regularmike

8

这适用于大写和小写字母..

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

1
太棒了,没错,谢谢 :) 我不知道“term”只能用小写字母。 - Jeremy Thille
这对我有效,谢谢。你知道是否有一种“更干净”的方法来完成它,而无需重复“match”子句吗? - tomfl

5

我的elasticsearch版本是6.0.1。我使用的方法如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接