使用新的 java api 在弹性搜索中排序

维沙尔·亚达夫

我正在使用最新的 java API 与弹性搜索服务器进行通信。

我需要以某种排序顺序搜索数据。

       SortOptions sort = new SortOptions.Builder().field(f -> f.field("customer.keyword").order(SortOrder.Asc)).build();
    List<SortOptions> list = new ArrayList<SortOptions>();
    list.add(sort);

    SearchResponse<Order> response = elasticsearchClient.search(b -> b.index("order").size(100).sort(list)
            .query(q -> q.bool(bq -> bq
                    .filter(fb -> fb.range(r -> r.field("orderTime").
                                    gte(JsonData.of(timeStamp("01-01-2022-01-01-01")))
                                    .lte(JsonData.of(timeStamp("01-01-2022-01-01-10")))
                            )
                    )
                   // .must(query)
            )), Order.class);

我已经编写了上面的代码,用于按客户排序的顺序获取搜索结果。运行程序时出现以下错误。

Exception in thread "main" co.elastic.clients.elasticsearch._types.ElasticsearchException: [es/search] failed: [search_phase_execution_exception] all shards failed
at co.elastic.clients.transport.rest_client.RestClientTransport.getHighLevelResponse(RestClientTransport.java:281)
at co.elastic.clients.transport.rest_client.RestClientTransport.performRequest(RestClientTransport.java:147)
at co.elastic.clients.elasticsearch.ElasticsearchClient.search(ElasticsearchClient.java:1487)
at co.elastic.clients.elasticsearch.ElasticsearchClient.search(ElasticsearchClient.java:1504)
at model.OrderDAO.fetchRecordsQuery(OrderDAO.java:128)

如果我删除.sort()方法,代码运行良好。

我的索引配置为以下格式。

{
"order": {
    "aliases": {},
    "mappings": {
        "properties": {
            "customer": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            },
            "orderId": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            },
            "orderTime": {
                "type": "long"
            },
            "orderType": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            }
        }
    },
    "settings": {
        "index": {
            "routing": {
                "allocation": {
                    "include": {
                        "_tier_preference": "data_content"
                    }
                }
            },
            "number_of_shards": "1",
            "provided_name": "order",
            "creation_date": "1652783550822",
            "number_of_replicas": "1",
            "uuid": "mrAj8ZT-SKqC43-UZAB-Jw",
            "version": {
                "created": "8010299"
            }
        }
    }
}

}

如果可能的话,请让我知道这里出了什么问题,请向我发送在新的 java API 中使用 sort() 的正确语法。

非常感谢。

萨加尔·帕特尔

正如您在评论中确认的那样,customer是一个文本类型字段,这就是您遇到错误的原因,因为排序不能应用于text字段类型。

您的索引应配置如下,以便客户字段应用排序:

{
    "mappings": {
        "properties": {
            "customer": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            }
        }
    }
}

一旦你有了上面的索引映射,你就可以使用customer.keyword作为字段名进行排序和customer作为字段名进行自由文本搜索。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章