现象

在做某一次用到elasticsearch的地位位置搜索时,报错:
ElasticsearchStatusException[Elasticsearch exception [type=search_phase_execution_exception, reason=all shards failed]]

我使用的是GeoDistanceQueryBuilder进行ElasticSearch的地理位置搜索以及排序

排查

后来登录到elasticsearch的服务器上去查看错误日志,发现报错如下:
在这里插入图片描述就是说我的location不是geo_point类型的,这个问题也是排查了好久。
问题的原因很简单,是因为我的index是通过IndexRequest自动创建的,会有问题。

例如:

 String string = JSONObject.fromObject(entity).toString();
            IndexRequest indexRequest = new IndexRequest(INDEX).type(DOC).id(INDEX + "_" + entity.getId()).source(string, XContentType.JSON);

            bulkRequest.add(indexRequest);

解决

手工创建,或者通过Java代码创建索引都可以。一定注意,对应mapping的属性的类型一定是geo_point才行

  • 这里我换了个索引,position表示位置信息
    在这里插入图片描述# 使用Java手工创建索引
public class CreateElsIndexMain {

    static final String INDEX_NAME = "t_els_mock";

    @Test
    public void test() throws Exception {
        RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
                new HttpHost(
                        "127.0.0.1",
                        9200,
                        "http"
                )));
        boolean exists = checkExists(client);
        if (exists) {
            deleteIndex(client);
        }
        createIndex(client);

    }

    public static boolean checkExists(RestHighLevelClient client) throws Exception {
        GetIndexRequest existsRequest = new GetIndexRequest();
        existsRequest.indices(INDEX_NAME);
        boolean exists = client.indices().exists(existsRequest, RequestOptions.DEFAULT);
        return exists;
    }

    public static void createIndex(RestHighLevelClient client) throws Exception {
        Settings.Builder setting = Settings.builder().put("number_of_shards", "5").put("number_of_replicas", 1);
        XContentBuilder mappings = JsonXContent.contentBuilder().
                startObject().startObject("properties").startObject("id").field("type", "text").endObject().
                startObject("name").field("type", "keyword").endObject().
                startObject("createTime").field("type", "keyword").endObject().
                startObject("score").field("type","keyword").endObject().
                startObject("longitude").field("type","float").endObject().
                startObject("latitude").field("type","float").endObject().
                startObject("position").field("type","geo_point").endObject().endObject().endObject();
        CreateIndexRequest request = new CreateIndexRequest(INDEX_NAME).settings(setting).mapping("doc",mappings);
        CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
        System.out.println(createIndexResponse);
    }


    public static void deleteIndex(RestHighLevelClient client) throws Exception {
        DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest();//删除索引同样要创建对象接受索引名
        deleteIndexRequest.indices(INDEX_NAME);//传递索引名
        //执行delete方法进行删除;
        AcknowledgedResponse delete = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
    }

}

Kibana数据

我们可以使用测试数据,将数据放到es中,通过kibana的dev tools查看该索引的数据,如下示例:

在这里插入图片描述

添加数据到es的代码


 @Autowired
    private RestHighLevelClient client;

    private static final String INDEX = "t_els_mock";

    String DOC = "doc";

public void addData(){
        BulkRequest bulkRequest = new BulkRequest();
        List<MockLocationEntity> entities = getEntities();
        for (MockLocationEntity entity : entities){
            String string = JSONObject.fromObject(entity).toString();
            IndexRequest indexRequest = new IndexRequest(INDEX).type(DOC).id(INDEX + "_" + entity.getId()).source(string, XContentType.JSON);

            bulkRequest.add(indexRequest);
        }
        try {
            BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);
            
        } catch (IOException e) {
        }
    }

    private static List<MockLocationEntity> getEntities(){
        List<MockLocationEntity> list = new ArrayList<>();

        MockLocationEntity one = new MockLocationEntity();
        one.setId(UUID.randomUUID().toString());
        one.setName("YuanYan GuoJi");
        one.setScore("10");
        one.setCreateTime("20220322145900");
        one.setLongitude(117.20);
        one.setLatitude(38.14);
        one.setPosition(one.getLatitude() + "," +one.getLongitude());


        MockLocationEntity two = new MockLocationEntity();
        two.setId(UUID.randomUUID().toString());
        two.setName("WenGuang DaSha");
        two.setScore("9");
        two.setCreateTime("20220322171100");
        two.setLongitude(116.01);
        two.setLatitude(38.89);
        two.setPosition(two.getLatitude() + "," +two.getLongitude());


        MockLocationEntity three = new MockLocationEntity();
        three.setId(UUID.randomUUID().toString());
        three.setName("NeiMengGu JiuDian");
        three.setScore("8");
        three.setCreateTime("20220322171101");
        three.setLongitude(117.99);
        three.setLatitude(39.24);
        three.setPosition(three.getLatitude() + "," +three.getLongitude());


        MockLocationEntity four = new MockLocationEntity();
        four.setId(UUID.randomUUID().toString());
        four.setName("GuoXianSheng");
        four.setScore("10");
        four.setCreateTime("20220322171102");
        four.setLongitude(117.20);
        four.setLatitude(39.50);
        four.setPosition(four.getLatitude() + "," +four.getLongitude());
        Location fourLocation = new Location();


        MockLocationEntity five = new MockLocationEntity();
        five.setId(UUID.randomUUID().toString());
        five.setName("NongYe YinHang");
        five.setScore("8");
        five.setCreateTime("20220322171103");
        five.setLongitude(116.89);
        five.setLatitude(39.90);
        five.setPosition(five.getLatitude() + "," +five.getLongitude());
        Location fiveLocation = new Location();

        MockLocationEntity six = new MockLocationEntity();
        six.setId(UUID.randomUUID().toString());
        six.setName("XingBaKe");
        six.setScore("9");
        six.setCreateTime("20220322171104");
        six.setLongitude(117.25);
        six.setLatitude(39.15);
        six.setPosition(six.getLatitude() + "," +six.getLongitude());


        MockLocationEntity seven = new MockLocationEntity();
        seven.setId(UUID.randomUUID().toString());
        seven.setName("JuFuYuan");
        seven.setScore("6");
        seven.setCreateTime("20220322171104");
        seven.setLongitude(117.30);
        seven.setLatitude(39.18);
        seven.setPosition(seven.getLatitude() + "," +seven.getLongitude());

        list.add(one);
        list.add(two);
        list.add(three);
        list.add(four);
        list.add(five);
        list.add(six);
        list.add(seven);

        return list;
    }

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐