簡體   English   中英

在 Spring java 框架中使用 ElasticSearch 的最佳方式

[英]The Best way to use ElasticSearch in Spring java framework

我正在開發一個計划使用 elasticsearch 作為數據存儲庫的系統。 我正在嘗試選擇最佳方式來開發我的應用程序,該應用程序可以從 elasticsearch 索引和查詢數據。 我擁有的系統是建立在 Spring 框架之上的。

使用Spring-data-elasticsearch ( https://github.com/spring-projects/spring-data-elasticsearch ) 是一個不錯的選擇嗎?

還是使用elasticsearch 核心庫本身是一個不錯的選擇?

我需要處理嵌套數據(內部對象),但 Spring-data-elasticsearch 最近似乎沒有操作。

我希望我能找到問題的解決方案。 提前致謝。

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

您可以在嵌套對象測試中找到有關嵌套和內部對象的更多測試用例

您可以使用 IndexQuery 進行保存和更新:

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

Spring data elasticsearch 使用傳輸客戶端,AWS elasticsearch 不支持傳輸客戶端。 AWS elasticsearch 僅支持 HTTP 客戶端。 所以我認為elasticsearch最好的java客戶端是JEST。 它還支持使用 IAM 的 AWS 身份驗證。

同樣對於使用 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM