【发布时间】:2011-12-16 15:10:51
【问题描述】:
我喜欢使用 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).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