Spring-data -asticsearch вложенный запрос не работает

1

Person.java

@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

public class Car {

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

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

// getter/setter
}

Индексирование и поиск с использованием основного метода

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

    }

Индексирование работает нормально, но поиск функционально не работает.
Я получаю следующий результат:

Список лиц: []

Пожалуйста, предложите. Заранее спасибо.

Теги:
elasticsearch
spring-data-elasticsearch

2 ответа

2
Лучший ответ

Наконец, я нахожу решение. Запрос, который я создал при поиске.

termQuery("cars.name", "Tata")

должен быть в нижнем регистре, поэтому правильный запрос будет -

QueryBuilder builder = nestedQuery(
                "cars",
                boolQuery().must(termQuery("cars.name", "tata")).must(
                        termQuery("cars.model", "safari")));
0

Другим вариантом было бы использовать matchQuery, который по умолчанию не учитывает регистр:

QueryBuilders.matchQuery("cars.name", "Tata")

Или вы можете использовать анализатор, который не имеет нижнего регистра, в отличие от стандартного.

здесь: https://discuss.elastic.co/t/how-to-do-case-insensitive-search-on-terms/19790

Ещё вопросы

Сообщество Overcoder
Наверх
Меню