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

时间:2018-02-01 07:44:02

标签: hibernate jsp lucene hibernate-search

我在JSP项目中实现了hibernate lucene搜索。我可以搜索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;

}

先谢谢你..

3 个答案:

答案 0 :(得分:1)

  

有没有办法获取匹配的字段名称和结果。

在Hibernate Search中没有内置的方法可以做到这一点,没有。可能有一种方法可以深入Lucene的内部,但除非你有非常严重的性能要求,否则我不建议这样做。

不,真的,最简单的方法就是自己动手。不要运行单个查询,而是运行三个:

  1. 一个过滤器&#34;标题或文字&#34;
  2. 只有&#34; firstName&#34;字段,以及ID上的过滤器,仅考虑与第一个查询匹配的实体
  3. 只有&#34; emailDetails.email_id&#34;字段,以及ID上的过滤器,仅考虑与第一个查询匹配的实体
  4. 然后第一个查询为您提供结果,第二个查询为您提供在&#34; firstName&#34;上匹配的实体列表。字段,第三个查询为您提供在&#34; emailDetails.email_id&#34;上匹配的实体列表。字段。

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

答案 1 :(得分:0)

一种令人费解的方法可能是使用突出显示并查找突出显示结果中单词的特定标记。

这里有一篇很好的文章解释了如何做到这一点:https://howtodoinjava.com/lucene/lucene-search-highlight-example/

不确定它会比Yoann提出的更好。

答案 2 :(得分:0)

您可以使用weight(当将Projection应用于查询时返回的结果)解析org.apache.lucene.search.Explanation的结果。