首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹性搜索中的动态滤波器构建

问弹性搜索中的动态滤波器构建
EN

Stack Overflow用户
提问于 2015-06-14 10:28:42
回答 1查看 1.6K关注 0票数 4

我正在建立API。我在elasticsearch有身份证,名字,价格。客户端为我提供了要应用的过滤器输入json。

输入1:下面是使用id=1 (整数)过滤记录

代码语言:javascript
复制
{
    "filters": {
        "id":1
    }

}

输入2:用户正在使用city=tokyo查询记录

代码语言:javascript
复制
{
    "filters": {
        "city":"tokyo"
    }

}

用于处理输入和查询弹性搜索的Java代码

代码语言:javascript
复制
        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:

代码语言:javascript
复制
{
        "filters": {
            "city":"tokyo",
            "id":3,
            "price":134.45
        }

}

对于每个字段和它们的数据类型,没有任何处理,我想用java在elasticsearch中查询上面的过滤器。我该怎么做?

更新:

尝试将所有字符串参数发送到弹性搜索,在异常以下

代码语言:javascript
复制
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]
EN

回答 1

Stack Overflow用户

发布于 2015-06-14 11:49:44

当您将termFilter用于FilterBuilder时,您不需要显式地指定值,因为它支持所有基本的基本Java类型,例如(float、int、long、string、object)。因此,只需使用FilterBuilders.termFilter(key,ele.getValue()),apache就可以处理该类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30828288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档