【问题标题】:The Best way to use ElasticSearch in Spring java framework在 Spring java 框架中使用 ElasticSearch 的最佳方式
【发布时间】:2014-01-22 17:46:18
【问题描述】:

我正在开发一个系统,计划将弹性搜索用作数据存储库。 我正在尝试选择开发我的应用程序的最佳方式,该应用程序可以索引和查询来自 elasticsearch 的数据。 我的系统是建立在 Spring 框架之上的。

使用 Spring-data-elasticsearch(https://github.com/spring-projects/spring-data-elasticsearch) 是不是一个不错的选择?

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

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

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

【问题讨论】:

    标签: java spring frameworks elasticsearch spring-data-elasticsearch


    【解决方案1】:

    Spring data elasticsearch支持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);
    

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

    【讨论】:

    • 你把搜索示例放在哪里?看来您不能将自定义方法放入 elasticsearchrepository 中进行实施。
    • 另外你如何使用分页,我们可以使用Pageable类吗?
    • 我似乎找不到任何更新数据的示例
    • 嗨 mohsin,如何从属性或以编程方式设置 @Document 注释的值。请帮助
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      Spring data elasticsearch 使用传输客户端,AWS elasticsearch 不支持传输客户端。 AWS elasticsearch 仅支持 HTTP 客户端。所以我认为elasticsearch最好的java客户端是JEST。它还支持使用 IAM 进行 AWS 身份验证。

      【讨论】:

        【解决方案4】:

        对于使用 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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-18
          • 2011-09-05
          • 1970-01-01
          • 2019-07-24
          • 1970-01-01
          • 1970-01-01
          • 2016-08-20
          相关资源
          最近更新 更多