【问题标题】:Elasticsearch match an array of stringsElasticsearch 匹配一个字符串数组
【发布时间】:2020-08-10 18:50:46
【问题描述】:

我的 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 的文档。

到目前为止,我已尝试将“术语”字段添加到我当前的工作查询中:

{
    "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

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

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

    "US" 不返回任何结果,但 "us" 有效,尽管索引字段为 "US" ...... 微弱 -_-'

    我也这样写了查询:

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

    【讨论】:

    • 我不明白为什么查询整数数组可以正常工作,但使用字符串数组却返回 0 个结果。这在使用“术语/术语”时似乎是正确的,但在使用“查询”时却不是。我想促进精确匹配是有意义的,但为什么不转换查询呢?很明显,我错过了一些东西。
    【解决方案2】:

    这适用于大写和小写..

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

    【讨论】:

    • 酷,没错,谢谢 :) 我不知道“术语”只适用于小写。
    • 这对我有用,谢谢。你知道是否有一种“更简洁”的方式来实现我们不必重复“匹配”子句?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      • 2014-06-08
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多