当前位置: 首页 > 知识库问答 >
问题:

Elasticsearch中动态滤波器的构建

盖马鲁
2023-03-14

我正在构建API。我在弹性搜索中有身份证,名字,价格。客户机为我提供输入json和要应用的过滤器。

输入1:下面用户正在筛选ID=1(整数)的记录

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

}

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

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

}

用于处理输入和查询到弹性搜索的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中查询上面的过滤器。我该怎么做?

更新:

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

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]

共有1个答案

诸葛煜
2023-03-14

在为FilterBuilder使用termFilter时,不需要显式指定值,因为它支持所有基本的基本Java类型,如(float、int、long、string、object)。因此,只需使用FilterBuilders.termFilter(key,ele.getValue()),apache lucene引擎负责处理类型。

 类似资料:
  • 我有一个代码就像 到目前为止,我还有各种其他方法,它们与上面的方法相同,只是过滤器不同。有些方法具有附加过滤器,有些方法具有不同的过滤器或没有过滤器。 我是否可能创建条件所需的过滤器集合并动态传递。并且集合中的所有过滤器都应用于流。我不想硬编码正在应用的过滤器列表。我想让它基于配置。我如何做到这一点?

  • 问题内容: 我正在寻找一种使用SQLAlchemy动态构造过滤器的方法。也就是说,给定该列,运算符名称和比较值,即可构造相应的过滤器。 我将尝试使用一个示例进行说明(这将用于构建API)。假设我们有以下模型: 我想将查询映射到过滤器。例如, 应该产生 应该产生 我环顾四周,看看它是如何完成的,但是找不到一种不涉及手动将每个运算符名称映射到比较器或类似名称的方法。例如,Flask- Restless

  • 如何在执行查询前过滤ElasticSearch2.2中的文档。我引用了这个页面,但仍然无法框出正确的查询。 https://www.elastic.co/guide/en/elasticsearch/reference/2.2/query-filter-context.html 这就是我想做的…我有很多应该从句,每个有2个必须从句。WOLLE子句中的任何一个都应该匹配以检索文档。我只包括了一个sh

  • 我想实现一个环中值滤波器 - 它所做的基本上是用它周围的圆形环中的像素的中值替换中心像素。我可以像这样制作一些半径的圆形面具 然后,我可以使用 scipy 的通用过滤器来获取值的中位数 上面的蒙版包含了圆圈内的像素。哪些像素应该位于圆周上对我来说似乎有点模糊(想想3*3,5*5,7*7内核中的圆)。有没有“响铃”功能我可以用OTS什么的? 为什么要这么做-试着使用本文的一部分http://page

  • 问题内容: 我刚刚开始使用SQLAlchemy。我决定使用它,因为我在sqlite查询中间使用了很多字符串表达式。 所以,这就是我的问题。我的桌子上有很多设备,每个设备都有维护级别的日期。关键是用户可以选择他想在屏幕上看到的维护级别。因此,我应该为他选择的每种维护级别组合“调整”我的SQLAlchemmy。 例如,在原始SQLite中。 SELECT * WHERE(设备IN [])和m_leve

  • 我对验证FIR滤波器感兴趣。我已经实现了一个移动平均FIR滤波器,并编写了几个刺激来验证。 第一个刺激是一个正弦波,我希望滤波器按原样通过。档案员有。第二个刺激,我只传递一个冲动,并期望协效出现在输出上。这是我实际看到的。 然而,我觉得有两个问题需要注意。首先,不能依赖于波形形状来判断滤波器是否工作。我必须有可量化的值,并使用它作为一个基础,以得出结论,如果过滤器是工作的。例如。信噪比... 以下