Hibernate Search:如何查询嵌入式实体

时间:2011-12-16 15:10:51

标签: lucene search-engine hibernate-search

我喜欢使用Hibernate Search在网页上的多个输入字段中实现复杂的自动提交功能。 每个输入字段都是针对自己的实体,比方说CountryCity。两个实体之间存在多对一的关系 (国家包含城市)。

自动提示应该有效,例如在打字时国家/地区名称前缀和城市字段已填写, 你只得到有这样一个城市的国家的建议(反之亦然)。

服务器端自动提供服务应返回投影列表 (entityId,entityName)被渲染到输入字段中(下拉列表,等等)。

根据架构,在阅读完本手册后,我尝试了以下索引架构:

SearchMapping mapping = new SearchMapping();

    mapping.analyzerDef(...
    .entity(City.class).indexed().indexName("MyIndex")
        .property("cityId", ElementType.FIELD)
            .documentId()
            .name("id")
    .property("name", ElementType.FIELD)
            .documentId()
            .name("id")
        .property("country", ElementType.METHOD)
            .indexEmbedded()
    .entity(Country.class).indexed()
        .property("id", ElementType.FIELD)
            .documentId()
            .name("id")
        .property("name", ElementType.METHOD)
            .field()
            .name("name")

此映射将City定义为主要实体,对吗? 我已将所有城市编入索引并能够查询它们(也可以通过组合这两个字段)。但是,我在查询城市时只能获得匹配。 即查询时     。fullTextSession.getSearchFactory()buildQueryBuilder()forEntity(City.class)获得();

当我输入“西班牙”时,这对国家字段没有用,我为西班牙的每个城市单行。 (西班牙,西班牙,西班牙,西班牙,......; - ))

问题是:如何搜索国家/地区实体?改变索引结构?索引程序?或者如何查询?

我找到的唯一方法是为country设置一个Facet,并为自动提示设置不同的方面。但是,这也不完美 因为不可能按字母顺序排序小平面。

当然,在这个例子中,我可以在映射中切换两个实体,但假设具有更复杂的实体图的场景。

更新:添加评论中要求的查询

为了构建查询,我使用了QueryBuilder。以下结果集生成了一个结果集,如西班牙示例中所示:

fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(City.class).get();

查询:

country.name:Spain

如果我尝试为国家/地区使用查询构建器

fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Country.class).get();

和查询:

name:Spain

我没有结果。

1 个答案:

答案 0 :(得分:1)

您没有显示实际查询。您不必使用查询DSL,但您也可以编写本机Lucene查询。在这两种情况下(DSL或本机Lucene),您都可以通过布尔逻辑组合查询。嵌入式实体遵循java bean表示法。例如,城市名称将作为 country.name 到达。同样,如果没有您的实际查询,很难提供更具体的反馈。

最后,但并非最不重要的是,facet也可以按字母顺序排序。检查FacetSortOrder.COUNT_DESC。