Spring-data-elasticsearch 嵌套查询不工作
Spring-data-elasticsearch nested query not working
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
}
使用 main 方法进行索引和搜索
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);
}
索引工作正常,但搜索功能不工作。
我得到以下输出:
Person List : []
求推荐。
提前致谢。
最后我找到了解决方案,我在搜索时构建的查询
termQuery("cars.name", "Tata")
应该是小写的,所以正确的查询应该是 -
QueryBuilder builder = nestedQuery(
"cars",
boolQuery().must(termQuery("cars.name", "tata")).must(
termQuery("cars.model", "safari")));
另一种选择是使用默认不区分大小写的 matchQuery:
QueryBuilders.matchQuery("cars.name", "Tata")
或者您可以使用不使用小写字母的分析器,这与标准分析器不同。
相关讨论在这里:https://discuss.elastic.co/t/how-to-do-case-insensitive-search-on-terms/19790
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
}
使用 main 方法进行索引和搜索
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);
}
索引工作正常,但搜索功能不工作。
我得到以下输出:
Person List : []
求推荐。 提前致谢。
最后我找到了解决方案,我在搜索时构建的查询
termQuery("cars.name", "Tata")
应该是小写的,所以正确的查询应该是 -
QueryBuilder builder = nestedQuery(
"cars",
boolQuery().must(termQuery("cars.name", "tata")).must(
termQuery("cars.model", "safari")));
另一种选择是使用默认不区分大小写的 matchQuery:
QueryBuilders.matchQuery("cars.name", "Tata")
或者您可以使用不使用小写字母的分析器,这与标准分析器不同。
相关讨论在这里:https://discuss.elastic.co/t/how-to-do-case-insensitive-search-on-terms/19790