Hibernate Search / Lucene - Search for and rank unrelated entities with a single query

davnicwil

I have a full-text search working with hibernate search and lucene, in that I can successfully search for a given model entity across specific fields.

However, rather than search for one type of entity at a time, I want to implement a 'universal' search where different entity types are searched for simultaneously, matching the search phrase to the appropriate fields on each different entity type, and then have the results ranked by relevance to the search terms, irrespective of the entity type.

So for example let's say I have different entities, Foo and Bar

@Entity
@Indexed
@AnalyzerDef(
  name="fulltext",
  tokenizer=@TokenizerDef(factory=StandardTokenizerFactory.class),
  filters={
    @TokenFilterDef(factory=LowerCaseFilterFactory.class),
    @TokenFilterDef(factory=SnowballPorterFilterFactory.class, 
      params={@Parameter(name="language", value="English") })
  }
)
public class Foo {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Integer fooId;

  @Column
  @Field 
  @Analyzer(definition="fulltext") 
  private String fieldA;

  ...

@Entity
@Indexed
public class Bar {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Integer barId;

  @Column
  @Field 
  @Analyzer(definition="fulltext") 
  private String fieldB;

  @Column
  @Field 
  @Analyzer(definition="fulltext") 
  private String fieldC;

  ...

So I want to search for "some text" and match over Foo.fieldA, and Bar.fieldB and/or Bar.fieldC

The current type of search I have working is specific to a particular entity, for example:

fullTextSession = Search.getFullTextSession(hibernateSession);
Query query = fullTextSession.createFullTextQuery(
                fullTextSession
                  .getSearchFactory()
                  .buildQueryBuilder()
                  .forEntity(Foo.class)
                  .get()
                  .keyword()
                  .onFields("fieldA")
                  .matching("some text")
                  .createQuery(),
              Foo.class);
 query.list() // gets ranked list of Foo entities matching "some text"

Clearly, the above Lucene query is specific to the Foo entity, and even the Foo.fieldA

So, is it possible to amend the Lucene query to also include Bar results, matching on the Bar.fieldB and Bar.fieldC fields?

I know the fullTextSession.createFullTextQuery(fulltextSession, Class...) method will also accept Bar.class, to return Bar results, but I don't know how to modify the actual query to search over Bar entities in the first place.


Another way I was thinking of solving this is to do separate queries, one for Foo entities, one for Bar entities, then merge the two result sets and sort them by 'match relevance score' - but I can't find how to get this score for results, either!

EDIT the above approach will likely not work - turns out you can get the score of the results via projections but the docs state that scores from separate queries can't be meaningfully compared:

FullTextQuery.SCORE: returns the document score in the query. Scores are handy to compare one result against an other for a given query but are useless when comparing the result of different queries.


Apologies if I'm covering well-trodden ground here but I've been searching, clearly in the wrong places, for hours on this and can't find anything helpful in the documentation, which is frustrating as I imagine this is a fairly common use-case for Lucene.

Hardy

You can write two queries and combine them via a BooleanQuery using Occur.SHOULD. Then use createFullTextQuery(booleanQuery, Foo.class, Bar.class); to search for both type of entities.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Hibernate Search query for class

来自分类Dev

使用Hibernate Search / Lucene标记云?

来自分类Dev

将最新的Hibernate Search与Lucene 4混合

来自分类Dev

Hibernate Search 5.0数值Lucene查询HSEARCH000233问题

来自分类Dev

在Java / MySQL / Hibernate Search / Lucene环境中建议标签

来自分类Dev

集合上的Hibernate Search(Lucene)过滤器

来自分类Dev

插入后,Hibernate Search不会重新索引lucene索引

来自分类Dev

如何在 Hibernate Lucene Search 中添加多个限制?

来自分类Dev

如何使用Hibernate Lucene Search进行不区分大小写的排序?

来自分类Dev

如何使用Hibernate Lucene Search对挪威字符(case,Ø和Å)进行不区分大小写的排序?

来自分类Dev

Hibernate Search / Lucene-通过单个查询搜索不相关实体并对其进行排名

来自分类Dev

如何使用Hibernate Lucene Search访问实体中外键的排序字段名称?

来自分类Dev

如果字符串中有“ =”,则Hibernate Search(Lucene)返回空结果

来自分类Dev

使用 Hibernate Search 时由于 lucene 锁导致 Spring Boot 集成测试失败

来自分类Dev

Hibernate Search查询类

来自分类Dev

Hibernate Search查询类

来自分类Dev

Spring Boot with Hibernate Search 找不到 org.hibernate.query.ParameterMetadata

来自分类Dev

Search query optimization in mysql

来自分类Dev

Hibernate Search索引单个租户

来自分类Dev

Hibernate Search索引单个租户

来自分类Dev

将?search = query重写为/ search / query和分页

来自分类Dev

Elastic Search Query with Java Api

来自分类Dev

在Elastic Search的本机脚本记分器中访问Lucene查询

来自分类Dev

使用Lucene和Azure Search .NET SDK进行模糊搜索

来自分类Dev

使用Zend_Search_Lucene_Search_QueryParser的highlightMatches函数时发生异常

来自分类Dev

Hibernate Search返回空结果列表

来自分类Dev

Hibernate Search Facet在多个字段上

来自分类Dev

Hibernate-Search 6和Elasticsearch集成

来自分类Dev

Hibernate Search 6中LocalDateTime的范围查询

Related 相关文章

  1. 1

    Hibernate Search query for class

  2. 2

    使用Hibernate Search / Lucene标记云?

  3. 3

    将最新的Hibernate Search与Lucene 4混合

  4. 4

    Hibernate Search 5.0数值Lucene查询HSEARCH000233问题

  5. 5

    在Java / MySQL / Hibernate Search / Lucene环境中建议标签

  6. 6

    集合上的Hibernate Search(Lucene)过滤器

  7. 7

    插入后,Hibernate Search不会重新索引lucene索引

  8. 8

    如何在 Hibernate Lucene Search 中添加多个限制?

  9. 9

    如何使用Hibernate Lucene Search进行不区分大小写的排序?

  10. 10

    如何使用Hibernate Lucene Search对挪威字符(case,Ø和Å)进行不区分大小写的排序?

  11. 11

    Hibernate Search / Lucene-通过单个查询搜索不相关实体并对其进行排名

  12. 12

    如何使用Hibernate Lucene Search访问实体中外键的排序字段名称?

  13. 13

    如果字符串中有“ =”,则Hibernate Search(Lucene)返回空结果

  14. 14

    使用 Hibernate Search 时由于 lucene 锁导致 Spring Boot 集成测试失败

  15. 15

    Hibernate Search查询类

  16. 16

    Hibernate Search查询类

  17. 17

    Spring Boot with Hibernate Search 找不到 org.hibernate.query.ParameterMetadata

  18. 18

    Search query optimization in mysql

  19. 19

    Hibernate Search索引单个租户

  20. 20

    Hibernate Search索引单个租户

  21. 21

    将?search = query重写为/ search / query和分页

  22. 22

    Elastic Search Query with Java Api

  23. 23

    在Elastic Search的本机脚本记分器中访问Lucene查询

  24. 24

    使用Lucene和Azure Search .NET SDK进行模糊搜索

  25. 25

    使用Zend_Search_Lucene_Search_QueryParser的highlightMatches函数时发生异常

  26. 26

    Hibernate Search返回空结果列表

  27. 27

    Hibernate Search Facet在多个字段上

  28. 28

    Hibernate-Search 6和Elasticsearch集成

  29. 29

    Hibernate Search 6中LocalDateTime的范围查询

热门标签

归档