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

Hibernate Search- How To get Matching Field Names

我在我的 JSP 项目中实现了 hibernate lucene 搜索。我可以搜索contact_name、contact_email(一对多)等,结果它将return成功匹配搜索关键字的联系人列表。但是我的问题是我想知道在哪个字段(columnn_name)中'match found'。有什么方法可以获取匹配的字段名称和结果。

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

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

我的联系人 class 看起来像这样

@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;

}

提前致谢..

Is there any way to grab the matching field name along with result.

在 Hibernate Search 中没有内置的方法来做到这一点,没有。可能有一种方法可以通过深入研究 Lucene 的内部结构来实现,但我不建议这样做,除非你有非常高的性能要求。

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

  1. 一个过滤器 "title OR text"
  2. 一个过滤器仅在 "firstName" 字段上,过滤器 ID 仅考虑与第一个查询匹配的实体
  3. 一个过滤器仅在 "emailDetails.email_id" 字段上,过滤器 ID 仅考虑与第一个查询匹配的实体

然后第一个查询给你结果,第二个查询给你在"firstName"字段上匹配的实体列表,第三个查询给你在[=上匹配的实体列表30=] 字段。

相关问题:.

一种复杂的方法可能是使用突出显示并在突出显示的结果中查找突出显示单词的特定标记。

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

虽然不确定它会比 Yoann 提议的更好。

你可以解析 org.apache.lucene.search.Explanation 的结果,并用 weight( 将 Projection 应用于查询时返回。