【问题标题】:Hibernate Search- How To get Matching Field NamesHibernate Search - 如何获取匹配的字段名称
【发布时间】:2018-02-01 07:44:01
【问题描述】:

我在我的 JSP 项目中实现了休眠 lucene 搜索。我可以搜索contact_name,contact_email(一对多)等,结果它会返回与搜索关键字匹配的联系人列表。但是我的问题是我想知道在哪个field(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;

}

提前谢谢你..

【问题讨论】:

    标签: hibernate jsp lucene hibernate-search


    【解决方案1】:

    有什么方法可以获取匹配的字段名和结果。

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      不确定它是否会比 Yoann 提议的更好。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 你能不能详细一点。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-03
        • 1970-01-01
        • 2016-09-20
        • 1970-01-01
        相关资源
        最近更新 更多