Lucene Hibernate搜索:如何查询嵌入的实体

Lucene Hibernate搜索:如何查询嵌入的实体,lucene,search-engine,hibernate-search,Lucene,Search Engine,Hibernate Search,我喜欢使用HibernateSearch跨网页上的多个输入字段实现复杂的自动提示功能。 每个输入字段都有自己的实体,比如说国家和城市。两个实体之间存在多对一关系 (国家包含城市) 自动提示功能应能在键入例如国家名称前缀和城市字段时进行操作, 你只会得到有这样一个城市的国家的建议(反之亦然) 服务器端自动建议服务应返回投影列表 (entityId,entityName),它们被渲染到输入字段(下拉列表,无论什么) 根据该模式,在阅读手册后,我尝试了以下索引模式: SearchMapping map

我喜欢使用HibernateSearch跨网页上的多个输入字段实现复杂的自动提示功能。 每个输入字段都有自己的实体,比如说
国家
城市
。两个实体之间存在多对一关系 (国家包含城市)

自动提示功能应能在键入例如国家名称前缀和城市字段时进行操作, 你只会得到有这样一个城市的国家的建议(反之亦然)

服务器端自动建议服务应返回投影列表 (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")
此映射将城市定义为主要实体,对吗?
我已经为所有城市编制了索引,并且能够查询它们(也可以通过合并这两个字段)。但是,我只在查询城市时获得匹配项。 i、 e.当你喜欢的时候 fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(City.class.get()

这对country字段没有用处,因为当我输入“西班牙”时,我会得到西班牙每个城市的一行。(西班牙,西班牙,西班牙,西班牙,…;-)

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

我找到的唯一方法是为
国家设置一个方面,然后将不同的方面作为自动建议。然而,这也不是完美的
因为无法按字母顺序对面进行排序

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

更新:添加注释中请求的查询

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

fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(City.class).get();
带查询:

country.name:Spain
如果我尝试使用国家/地区的查询生成器

fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Country.class).get();
和查询:

name:Spain

我没有结果

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


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

哦,我明白了,我监督了那个特定的排序选项(我想你应该说FacetSortOrder.FIELDVALUE)。关于您评论的第一部分:我的问题不是在一个查询中组合条件,而是获得我想要的实体。所有返回的行都符合标准,但我希望得到匹配的国家,而不是国家匹配“西班牙”的城市。我会更新这个问题。