一尘不染

Hibernate搜索-如何获取匹配的字段名称

jsp

我已经在我的JSP项目中实现了hibernateLucene搜索。我可以搜索contact_name,contact_email(一对多)等,结果它将成功返回与搜索关键字匹配的联系人列表。但是
我的问题是 我想知道“匹配项” 在哪个 字段(columnn_name) 中找到。有什么办法来获取匹配的字段名和结果。

这就是我编写搜索查询并获得结果的方式

 List<Contact> searchResultContact = new ArrayList<Contact>();
 FullTextSession fullTextSession = Search.getFullTextSession(session);
 QueryBuilder qb = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Contact.class).get();

 org.apache.lucene.search.Query query1 = qb.phrase().withSlop(2)
                    .onField("firstName")
                   .andField("emailDetails.email_id")
                   .boostedTo(5)
                   .sentence(searchText.toLowerCase()).createQuery();
        org.apache.lucene.search.Query query2 = qb.keyword()
                .onField("status")
                .matching("0")
                .createQuery();
        org.apache.lucene.search.Query query = qb
                .bool()
                  .must( query1 )
                  .must( query2)
                .createQuery();

        org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery(query, Contact.class);

        searchResultContact = hibQuery.list();

我的联络人课程看起来像这样

@Entity
@Indexed
@Table(name = "contact")

public class Contact {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Column(name = "firstName", nullable = false, length = 128)
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO, analyzer = @Analyzer(definition = "ngram"))
private String firstName;

@OneToMany(fetch = FetchType.EAGER)
@Fetch(FetchMode.SELECT)
@JoinColumn(name = "contact_id")
@IndexedEmbedded
List<EmailDetails> emailDetails;

}

先感谢您..


阅读 184

收藏
2020-06-10

共1个答案

一尘不染

有什么办法来获取匹配的字段名和结果。

在Hibernate
Search中没有内置的方法可以做到这一点。可能有一种方法可以通过深入研究Lucene的内部原理来实现,但是除非您对性能的要求很高,否则我不建议您这样做。

不,实际上,最简单的方法是自己做。而不是运行单个查询,而是运行三个:

  1. 一个带有“标题或文本”过滤器的
  2. 一个仅在“ firstName”字段上使用过滤器,而在ID上使用过滤器以仅考虑与第一个查询匹配的实体
  3. 一个过滤器,仅在“ emailDetails.email_id”字段上使用过滤器,对ID进行过滤,以仅考虑与第一个查询匹配的实体

然后,第一个查询为您提供结果,第二个查询为您提供在“ firstName”字段上匹配的实体的列表,第三个查询为您提供在“
emailDetails.email_id”字段上匹配的实体的列表。

相关问题:https :
//stackoverflow.com/a/47832433/6692043。

2020-06-10