我喜欢使用Hibernate Search在网页上的多个输入字段中实现复杂的自动提交功能。
每个输入字段都是针对自己的实体,比方说Country
和City
。两个实体之间存在多对一的关系
(国家包含城市)。
自动提示应该有效,例如在打字时国家/地区名称前缀和城市字段已填写, 你只得到有这样一个城市的国家的建议(反之亦然)。
服务器端自动提供服务应返回投影列表 (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
我没有结果。
答案 0 :(得分:1)
您没有显示实际查询。您不必使用查询DSL,但您也可以编写本机Lucene查询。在这两种情况下(DSL或本机Lucene),您都可以通过布尔逻辑组合查询。嵌入式实体遵循java bean表示法。例如,城市名称将作为 country.name 到达。同样,如果没有您的实际查询,很难提供更具体的反馈。
最后,但并非最不重要的是,facet也可以按字母顺序排序。检查FacetSortOrder.COUNT_DESC。