繁体   English   中英

Hibernate Search:获取SQL IN运算符的功能

[英]Hibernate Search: Getting the functionality of the SQL IN operator

在Hibernate搜索中创建查询时能否获得SQL IN运算符的功能?

例如,我有两个简单的类(省略了构造函数,getter和setter):

@Entity
@Indexed
public class Product {
    private long id;
    @Field
    private String title;
    @IndexedEmbedded
    private Category category;
}

@Entity
public class Category {
    private long id;
    @Field
    private String name;
}

当前,我有以下查询,该查询按标题搜索产品:

org.apache.lucene.search.Query luceneQuery = queryBuilder
        .keyword()
        .onField("title")
        .matching(queryString)
        .createQuery();

但我只想按标题在特定类别中搜索产品。 有要搜索的类别ID(或名称)列表,如何创建此类查询?

我已经找到了这个问题 ,但是作者没有找到合适的解决方案。 也许现在这样的功能已经存在?

我将不胜感激。

首先,索引类别的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;
}

然后,确保例如使用mass indexer重新索引数据。

然后,按照以下说明更改查询代码。

首先,您需要“ 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();

最后,您需要将该查询与标题上的其他查询合并。 为此,请使用另一个布尔连接,这一次mustmust运算符(所有子句必须匹配):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM