我正在开发一个计划将elasticsearch用作数据存储库的系统。 我正在尝试选择开发我的应用程序的最佳方法,该应用程序可以索引和查询elasticsearch中的数据。 我拥有的系统建立在Spring框架之上。
使用 Spring-data-elasticsearch (https://github.com/spring-projects/spring-data-elasticsearch)是不是一个好的选择?
或者使用 elasticsearch核心库本身是一个不错的选择?
我需要处理嵌套数据(内部对象),但Spring-data-elasticsearch最近似乎没有操作。
我希望我能找到问题的解决方案。 提前谢谢。
答案 0 :(得分:26)
Spring数据elasticsearch支持弹性搜索的大多数常见功能集,包括嵌套,内部对象和父子(最近)。
当你说要使用嵌套数据(内部对象)时,请清楚,因为elasticsearch有两个概念:内部对象和嵌套对象。
详细说明可在managing relationship in elasticsearch
找到人员实体:
@Document(indexName = "person" , type = "user")
public class Person {
@Id
private String id;
private String name;
@Field( type = FieldType.Nested)
private List<Car> car;
// setters-getters
}
汽车实体:
public class Car {
private String name;
private String model;
//setters and getters
}
设置数据:
Person foo = new Person();
foo.setName("Foo");
foo.setId("1");
List<Car> cars = new ArrayList<Car>();
Car subaru = new Car();
subaru.setName("Subaru");
subaru.setModel("Imprezza");
cars.add(subaru);
foo.setCar(cars);
索引:
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(foo.getId());
indexQuery.setObject(foo);
//creating mapping
elasticsearchTemplate.putMapping(Person.class);
//indexing document
elasticsearchTemplate.index(indexQuery);
//refresh
elasticsearchTemplate.refresh(Person.class, true);
搜索:
QueryBuilder builder = nestedQuery("car", boolQuery()
.must(termQuery("car.name", "subaru"))
.must(termQuery("car.model", "imprezza")));
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build();
List<Person> persons = elasticsearchTemplate.queryForList(searchQuery, Person.class);
找到有关嵌套和内部对象的更多测试用例
答案 1 :(得分:1)
您可以使用IndexQuery进行保存和更新:
public Serializable saveOrUpdate(Car car) {
return template.index(new IndexQueryBuilder().withObject(car).build());
}
答案 2 :(得分:1)
Spring data elasticsearch使用传输客户端,AWS elasticsearch不支持传输客户端。 AWS elasticsearch仅支持HTTP客户端。所以我认为elasticsearch最好的java客户端是JEST。它还使用IAM为AWS身份验证提供支持。
答案 3 :(得分:0)
对于使用Spring Boot在Elasticsearch中进行类似查询,您也可以执行以下操作:
Car car = new Car();
car.setName(new InnerField("name", "имя"));
QueryBuilder builder = QueryBuilders
.boolQuery()
.should(QueryBuilders.regexpQuery("name.ru", ".*" + name + ".*"))
.should(QueryBuilders.regexpQuery("name.kk", ".*" + name + ".*"))
.should(QueryBuilders.regexpQuery("name.qq", ".*" + name + ".*"));
NativeSearchQuery build = new NativeSearchQueryBuilder().withQuery(builder).build();
elasticsearchOperations.queryForList(build, tClass);