Lucene Hibernate搜索:如何查询嵌入的实体
我喜欢使用HibernateSearch跨网页上的多个输入字段实现复杂的自动提示功能。 每个输入字段都有自己的实体,比如说Lucene Hibernate搜索:如何查询嵌入的实体,lucene,search-engine,hibernate-search,Lucene,Search Engine,Hibernate Search,我喜欢使用HibernateSearch跨网页上的多个输入字段实现复杂的自动提示功能。 每个输入字段都有自己的实体,比如说国家和城市。两个实体之间存在多对一关系 (国家包含城市) 自动提示功能应能在键入例如国家名称前缀和城市字段时进行操作, 你只会得到有这样一个城市的国家的建议(反之亦然) 服务器端自动建议服务应返回投影列表 (entityId,entityName),它们被渲染到输入字段(下拉列表,无论什么) 根据该模式,在阅读手册后,我尝试了以下索引模式: SearchMapping map
国家
和城市
。两个实体之间存在多对一关系
(国家包含城市)
自动提示功能应能在键入例如国家名称前缀和城市字段时进行操作,
你只会得到有这样一个城市的国家的建议(反之亦然)
服务器端自动建议服务应返回投影列表
(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)。关于您评论的第一部分:我的问题不是在一个查询中组合条件,而是获得我想要的实体。所有返回的行都符合标准,但我希望得到匹配的国家,而不是国家匹配“西班牙”的城市。我会更新这个问题。