java - Elasticsearch 中的动态过滤器构建

标签 java elasticsearch playframework-2.0 elasticsearch-plugin

我正在构建 API。我在 elasticsearch 中有 id、name、price。客户端向我提供了带有要应用的过滤器的输入 json。

输入 1:下面的用户正在过滤 id=1(整数)的记录

{
    "filters": {
        "id":1
    }

}

输入 2:用户正在查询带有 city=tokyo 的记录

{
    "filters": {
        "city":"tokyo"
    }

}

用于处理输入和查询 Elasticsearch 的 Java 代码

        filters = ipjson.path("filters");
        Iterator<Entry<String, JsonNode>> ite = filters.fields();

        while (ite.hasNext()) {
            Entry<String, JsonNode> ele = ite.next();
            String key = ele.getKey();
            if (ele.getValue().isInt()) {
                andFilter.add(FilterBuilders.termFilter(key, ele.getValue().asInt()))

            } else if (ele.getValue().isTextual()) {
                andFilter.add(FilterBuilders.termFilter(key, ele.getValue().textValue()));
            }


        }

对于过滤器中收到的每个键,我正在检查输入值的数据类型。

我想支持所有列。我想要一个不检查输入数据类型的通用解决方案。

输入 3:

{
        "filters": {
            "city":"tokyo",
            "id":3,
            "price":134.45
        }

}

在不对每个字段及其数据类型进行任何处理的情况下,我想使用 java API 在 elasticsearch 中查询上述过滤器。我该怎么做?

更新:

尝试将所有字符串参数发送到elastic search,出现以下异常

SearchParseException[[project][4]: from[-1],size[-1]: Parse Failure [Failed to parse source [{"query":{"filtered":{"filter":{"and":{"filters":[{"term":{"id":"\"1\""}}]}}}}}]]]; nested: NumberFormatException[For input string: ""1""]; }
    at org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction.onFirstPhaseResult(TransportSearchTypeAction.java:233) ~[elasticsearch-1.4.1.jar:na]
    at org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction$1.onFailure(TransportSearchTypeAction.java:179) ~[elasticsearch-1.4.1.jar:na]
    at org.elasticsearch.search.action.SearchServiceTransportAction$23.run(SearchServiceTransportAction.java:565) ~[elasticsearch-1.4.1.jar:na]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.7.0_60]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.7.0_60]

最佳答案

当您将 termFilter 用于 FilterBuilder 时,您无需明确指定值,因为它支持所有基本的原始 Java 类型,例如(float、int、long、string、object)。所以只需使用 FilterBuilders.termFilter(key, ele.getValue()) 和 apache lucene 引擎来处理类型。

关于java - Elasticsearch 中的动态过滤器构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30828288/

相关文章:

java - 对我的客户端 Java 程序进行多线程处理

java - Android:使默认全息按钮不透明

playframework - 从 Play 2.1 提供视频文件

scala - 带有多对多表的光滑嵌套外连接

java - 如何在 Java 中使用 Collections 对从类中填充的列表进行排序

java - Thymeleaf:通过索引从数组列表中获取项目

elasticsearch - Elasticsearch哪个是更好的聚合

ElasticSearch 反复崩溃 "HeapDumpOnOutOfMemoryError"尽管有 4GB ES_MAX_MEM

mongodb - Elasticsearch River(mongodb),建模架构

mongodb - Scala Play Salat 聚合示例