在做某一次用到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才行
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);
}
}
我们可以使用测试数据,将数据放到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;
}