在Spring Java框架中使用ElasticSearch的最佳方法

23

我正在开发一个系统,计划使用elasticsearch作为数据存储库。

我正在尝试选择最佳的开发应用程序的方式,以便可以从elasticsearch索引和查询数据。

我所用的系统是建立在Spring框架之上的。

使用Spring-data-elasticsearchhttps://github.com/spring-projects/spring-data-elasticsearch)是否是一个好选择?

还是使用elasticsearch核心库本身是一个不错的选择?

我需要处理嵌套数据(内部对象),但是Spring-data-elasticsearch最近似乎没有这方面的操作。

我希望能够找到这个问题的解决方案。谢谢提前。

4个回答

27

Spring data elasticsearch支持elasticsearch的大部分常见功能集,包括嵌套对象、内部对象和父子关系(最近)。

当您说要使用嵌套数据(内部对象)时,请明确elasticsearch有两个概念: 内部对象和嵌套对象。

详细解释可以在管理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);

您可以在Nested Object Tests中找到更多有关嵌套对象和内部对象的测试用例。


你把搜索示例放在哪里?似乎你不能将自定义方法放在elasticsearchrepository中进行实现。 - Maxrunner
还有,您如何在此使用分页,我们可以使用Pageable类吗? - Maxrunner
3
我似乎找不到任何例子来更新数据。 - Titi Wangsa bin Damhore
嗨,Mohsin,如何从属性或程序中设置 @Document 注释的值。请帮忙。 - Sachin

1
您可以使用IndexQuery来保存和更新:

public Serializable saveOrUpdate(Car car) {
    return template.index(new IndexQueryBuilder().withObject(car).build());
}

1

Spring data elasticsearch 使用 transport client,而 transport client 不支持 AWS elasticsearch。AWS elasticsearch 只支持 HTTP 客户端。因此我认为最好的 elasticsearch Java 客户端是 JEST。它还提供了使用 IAM 进行 AWS 认证的支持。


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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接