【问题标题】:Is it possible to create something similar to WHERE NOT IN ( :values ) in Hibernate Search?是否可以在 Hibernate Search 中创建类似于 WHERE NOT IN ( :values ) 的内容?
【发布时间】:2021-05-17 04:10:41
【问题描述】:

我正在通过 Internet 积极搜索我知道可以完成的事情的解决方案,但我很沮丧为什么它不适用于 Hibernate Search。我正在寻找的是类似于 SQL 子句where not in (1,2,3)

我有两个实体,A 和 B。

@Indexed
public class A
{
   @Field
   public String field1;
   @FieldBridge(impl = LongBridge.class)
   public Long field2;
   @IndexEmbedded
   public Set<B> names;
}

public class B {
   @Field
   public String field3;
   @ContainedIn
   public Set<A> names2;
}

我正在使用如下所示的 querybuilder 积极运行搜索:

queryBuilder.keyword()
                .fuzzy()
                .onFields("field1", "names.field3", "field2")
                .matching(matching+"-field2:(1 2 3)")
                .createQuery();

matching 并不认为这是完整的 Lucene 匹配模式。它返回将field2 设置为1 2 3 的值,而不是过滤掉这些文档。

编辑1: 我发现布尔查询生成器很有帮助,我创建了调用not() 的查询,期望它过滤数据。底层的 lucene 查询是我所期望的,和我在第一种方法中写的一样,但是 lucene 仍然返回错误的值。另一方面,使用此表达式进行 lucene 索引查询的 Luke 工具返回了我所期望的结果。

编辑2: 我做错的是我使用了单个查询和连接值,而 field2 的每个值都应该由另一个布尔连接携带。现在效果很好!

我做错了什么?我应该使用其他机制吗? Hibernate Search 是否也支持它?

【问题讨论】:

    标签: java hibernate lucene hibernate-search


    【解决方案1】:

    .keyword()...matching( ... ) 的参数不是接受特殊字符的查询。此方法期望传递纯文本。您不能在其中使用-:

    如果所有这些内容都是由用户直接传递的,并且您确实需要接受运算符的内容,请查看simpleQueryString()

    如果过滤器是你自己提供的,开发者,只需使用bool query

    在你的情况下:

    Query includedQuery = queryBuilder.keyword()
                    .fuzzy()
                    .onFields("field1", "names.field3", "field2")
                    .matching(matching)
                    .createQuery();
    
    BooleanJunction<?> combinedQueryBuilder = querybuilder.bool();
    combinedQueryBuilder.must(includedQuery);
    for (String excluded : Arrays.asList("1", "2", "3")) {
        combinedQueryBuilder.mustNot(queryBuilder.keyword()
                    .fuzzy()
                    .onField("field2")
                    .matching(excluded)
                    .createQuery());
    }
    
    Query combinedQuery = combinedQueryBuilder.createQuery();
    

    【讨论】:

      猜你喜欢
      • 2014-06-20
      • 1970-01-01
      • 2011-08-10
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 2019-03-03
      • 2012-01-24
      • 1970-01-01
      相关资源
      最近更新 更多