首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring-data-elasticsearch嵌套查询不起作用

Spring-data-elasticsearch嵌套查询不起作用
EN

Stack Overflow用户
提问于 2015-02-05 09:18:30
回答 2查看 4.8K关注 0票数 1

Person.java

代码语言:javascript
复制
@Document(indexName = "person", type = "user")
public class Person {

    @Id
    private String id;

    @Field(type = FieldType.String)
    private String name;

    @Field(type = FieldType.Nested)
    private List<Car> cars;

// getter/setter

}

Car.java

代码语言:javascript
复制
public class Car {

    @Field(type = FieldType.String)
    private String name;

    @Field(type = FieldType.String)
    private String model;

// getter/setter
}

使用主要方法的索引和检索

代码语言:javascript
复制
public class SpringElasticSearchTest {

    public static void main(String[] args) {

        ApplicationContext applicationContext = new FileSystemXmlApplicationContext(
                "src/main/webapp/WEB-INF/spring/applicationContext.xml");

        ElasticsearchTemplate est = (ElasticsearchTemplate) applicationContext
                .getBean("elasticsearchTemplate");

        Person pers = new Person();
        pers.setName("Manish");
        pers.setId("1");

        List<Car> cars = new ArrayList<Car>();
        Car subaru = new Car();
        subaru.setName("Tata");
        subaru.setModel("Safari");
        cars.add(subaru);
        pers.setCars(cars);

        IndexQuery indexQuery = new IndexQuery();
        indexQuery.setId(pers.getId());
        indexQuery.setObject(pers);

        est.deleteIndex("person");

        est.createIndex(Person.class);
        est.putMapping(Person.class);
        est.index(indexQuery);
        est.refresh(Person.class, true);

        QueryBuilder builder = nestedQuery(
                "cars",
                boolQuery().must(termQuery("cars.name", "Tata")).must(
                        termQuery("cars.model", "Safari")));
        SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(
                builder).build();
        List<Person> persons = est.queryForList(searchQuery, Person.class);
        System.out.println("Person List : " + persons);

    }

索引工作正常,但搜索功能不起作用。

我得到以下输出:

人员名单:[]

请建议一下。提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-06 02:56:20

最后,我找到了解决方案,我在搜索时构建的查询。

代码语言:javascript
复制
termQuery("cars.name", "Tata")

应该是小写,所以正确的查询应该是-

代码语言:javascript
复制
QueryBuilder builder = nestedQuery(
                "cars",
                boolQuery().must(termQuery("cars.name", "tata")).must(
                        termQuery("cars.model", "safari")));
票数 3
EN

Stack Overflow用户

发布于 2015-09-29 09:00:09

另一种选择是使用matchQuery,默认情况下这是不区分大小写的:

代码语言:javascript
复制
QueryBuilders.matchQuery("cars.name", "Tata")

或者,您可以使用不降低大小写的分析器,而不是标准的分析器。

相关讨论:https://discuss.elastic.co/t/how-to-do-case-insensitive-search-on-terms/19790

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28340165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档