【问题标题】:Find all elasticsearch documents with a field that is an array查找所有字段为数组的 elasticsearch 文档
【发布时间】:2015-09-25 22:30:58
【问题描述】:

我有一个包含一个字段 ('fieldA') 的文档,该字段可以包含一个字符串或一个字符串数组。实际上,我更希望它只包含字符串,但弹性搜索映射不能那样工作。无论如何,现在我需要找到该字段为数组的每个文档。我该怎么做?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    这个怎么样:

    {
        "query" : {
            "filtered" : {
                "filter" :{
                    "script" : {
                        "script" : "_source.fieldA.getClass() != String"
                    }
                }
            }
        }
    }
    

    我必须打开特定的 Elasticsearch 设置才能在较新版本的 Elasticsearch 中使用该脚本。

    script.engine.groovy.inline.search: on
    

    这是我为创建示例索引而运行的脚本并尝试一下:

    curl -w "\n" -XDELETE localhost:9200/scrap
    
    curl -w "\n" -XPUT localhost:9200/scrap/ -d '
    index :
        number_of_replicas : 0
    '
    
    curl -w "\n" -XPUT localhost:9200/scrap/script-demo/1?refresh=1 -d '{
        "fieldA" : "test string 1"
    }'
    
    curl -w "\n" -XPUT localhost:9200/scrap/script-demo/2?refresh=1 -d '{
        "fieldA" : [
            "test string 1",
            "test string 2"
        ]
    }'
    
    curl -w "\n" -XPUT localhost:9200/scrap/script-demo/3?refresh=1 -d '{
        "fieldA" : [
            "test string 1"
        ]
    }'
    
    curl -w "\n" -XPOST localhost:9200/scrap/script-demo/_search -d '{
        "query" : {
            "filtered" : {
                "filter" :{
                    "script" : {
                        "script" : "_source.fieldA.getClass() != String"
                    }
                }
            }
        }
    }' | python -m json.tool
    
    # curl -w "\n" -XDELETE localhost:9200/scrap
    

    当然,我正在对您可能在现场使用的分析仪做出假设,并且类似的细节可能会发挥作用。

    这里有一些关于脚本的资源:

    看起来脚本过滤器在 v2.0 中被替换了。

    【讨论】:

    • 当我在做的时候,你知道为什么脚本有时使用 doc[]、ctx._source,而其他时候只使用 _source?我似乎在文档中找不到任何关于此的线索。
    • 查看script fields 上的文档。我只看到scripted updates 的ctx._source。我想知道这是否是唯一合适的地方......对不起,不确定:(好问题......直到现在我才想知道。
    猜你喜欢
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多