【问题标题】:Hibernate Search: how to query for embeded entitiesHibernate Search:如何查询嵌入式实体
【发布时间】:2011-12-16 15:10:51
【问题描述】:

我喜欢使用 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).get();

这对于国家/地区字段没有用,因为当我输入“西班牙”时,西班牙的每个城市都会得到一行。 (西班牙,西班牙,西班牙,西班牙...... ;-))

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

我发现的唯一方法是为country 设置一个 Facet,然后将不同的可能方面作为自动建议。然而,这也并不完美 因为无法按字母顺序对构面进行排序。

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

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

为了构建查询,我使用了 QueryBuilder。下面生成一个类似于西班牙示例的结果集:

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

有查询:

country.name:Spain

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

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

和查询:

name:Spain

我没有得到任何结果。

【问题讨论】:

    标签: lucene search-engine hibernate-search


    【解决方案1】:

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

    最后但同样重要的是,构面也可以按字母顺序排序。检查 FacetSortOrder.COUNT_DESC。

    【讨论】:

    • 哦,我明白了,我监督了那个特定的排序选项(我猜你想说的是 FacetSortOrder.FIELDVALUE)。关于您评论的第一部分:我的问题不是在一个查询中组合标准,而是获取我想要的实体。所有返回的行都符合条件,但我想获得匹配的国家,而不是国家匹配“西班牙”的城市。我会更新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    相关资源
    最近更新 更多