Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate搜索-如何获取匹配的字段名_Hibernate_Jsp_Lucene_Hibernate Search - Fatal编程技术网

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

Hibernate搜索-如何获取匹配的字段名,hibernate,jsp,lucene,hibernate-search,Hibernate,Jsp,Lucene,Hibernate Search,我已经在我的JSP项目中实现了hibernate lucene搜索。我可以搜索联系人姓名、联系人电子邮件(一对多)等,因此它将返回与搜索关键字成功匹配的联系人列表。但是我的问题是我想知道在哪个字段(columnn\u name)中找到了“匹配项”。是否有任何方法可以获取匹配的字段名和结果 这就是我编写搜索查询和获取结果的方式 List<Contact> searchResultContact = new ArrayList<Contact>(); FullTextSe

我已经在我的JSP项目中实现了hibernate lucene搜索。我可以搜索联系人姓名、联系人电子邮件(一对多)等,因此它将返回与搜索关键字成功匹配的联系人列表。但是我的问题是我想知道在哪个字段(columnn\u 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();
List searchResultContact=new ArrayList();
FullTextSession FullTextSession=Search.getFullTextSession(会话);
QueryBuilder qb=fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Contact.class.get();
org.apache.lucene.search.Query query1=qb.phrase().withSlop(2)
.onField(“名字”)
.andField(“emailDetails.email\u id”)
布斯特德托先生(5)
.语句(searchText.toLowerCase()).createQuery();
org.apache.lucene.search.Query query2=qb.keyword()
.onField(“状态”)
.匹配(“0”)
.createQuery();
org.apache.lucene.search.Query Query=qb
.bool()
.必须(查询1)
.必须(查询2)
.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;

}
@实体
@索引
@表(name=“contact”)
公共类联系人{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私有int-id;
@列(name=“firstName”,null=false,长度=128)
@字段(index=index.YES,analyze=analyze.YES,store=store.NO,analyzer=@analyzer(definition=“ngram”))
私有字符串名;
@OneToMany(fetch=FetchType.EAGER)
@Fetch(FetchMode.SELECT)
@JoinColumn(name=“contact\u id”)
@指数化
列出详细信息;
}
先谢谢你

是否有任何方法可以获取匹配的字段名和结果

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

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

  • “标题或文本”上带有过滤器的
  • 只有在“FieldNeX”字段上有一个筛选器,IDS上只有一个筛选器,只考虑与第一个查询匹配的实体 仅在“Email细节.EMAILIID”字段上有一个筛选器,在IDS上只有一个过滤器,只考虑与第一个查询匹配的实体 然后第一个查询给出结果,第二个查询给出在“firstName”字段中匹配的实体列表,第三个查询给出在“emailDetails.email_id”字段中匹配的实体列表


    相关问题:。

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

    这里有一篇很好的文章解释了如何做到这一点:


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

    您可以用权重解析org.apache.lucene.search.explainion的结果(当投影应用于查询时返回)。

    请您详细一点。