1 回答
TA贡献1815条经验 获得超6个赞
首先,索引类别的id:
@Entity
@Indexed
public class Product {
private long id;
@Field
private String title;
@IndexedEmbedded
private Category category;
}
@Entity
public class Category {
@Field // Added this
private long id;
@Field
private String name;
}
然后,确保重新索引您的数据,例如使用质量索引器。
然后,如下所述更改您的查询代码。
您首先需要“SQL IN”,它在 Lucene 世界中表示为category.id = <first> OR category.id = <second> OR .... 只有布尔运算符与您可能习惯的有所不同(请参见此处);在您的情况下,您希望“至少一个”子句匹配,因此您必须使用should运算符:
List<Long> categoryIds = ...; // Provided by the user
BooleanJunction<?> categoryIdJunction = queryBuilder.bool();
for ( categoryId : categoryIds ) {
categoryIdJunction.should(
queryBuilder
.keyword()
.onField("category.id")
.matching(categoryId)
.createQuery();
);
}
org.apache.lucene.search.Query categoryIdQuery = categoryIdJunction.createQuery();
最后,您需要将该查询与标题上的其他查询结合起来。为此,使用另一个布尔连接,这次使用must运算符(所有子句必须匹配):
org.apache.lucene.search.Query titleQuery = queryBuilder
.keyword()
.onField("title")
.matching(queryString)
.createQuery();
org.apache.lucene.search.Query luceneQuery = queryBuilder.bool()
.must( categoryIdQuery )
.must( titleQuery )
.createQuery();
添加回答
举报