【发布时间】:2018-12-18 18:24:53
【问题描述】:
我们正在将我们的 java 应用程序从使用 SOLR/Lucene 转换为 Elasticsearch 5.6.6。
在 1 个特定区域,我们之前会构建 1 个 Lucene Search BooleanQuery 并针对 3 个不同的实体运行它,寻找匹配项。在您运行实际查询之前,我们不需要指定它所针对的实体。
BooleanQuery luceneQuery = myQueryBuilder.buildMyQuery();
session.createFullTextQuery(luceneQuery, entityOne);
session.createFullTextQuery(luceneQuery, entityTwo);
session.createFullTextQuery(luceneQuery, entityThree);
上面 [luceneQuery] 中的一个子查询在 taxId 上搜索,其中 entityOne 没有(没有 taxId 索引字段),但其他 2 个实体有。但是一切都很好,没有给出任何例外,我相信它只是忽略了未知/未索引的字段,不完全确定它是如何工作的,但确实如此。
现在我们正在转换为 Elasticsearch DSL,我们需要预先提供实体,因此我(无论好坏)针对每个实体构建 3 次不同的查询,如下所示:
QueryBuilder entityOneQB = session.getSearchFactory().buildQueryBuilder().forEntity(EntityOne.class).get();
QueryBuilder entityTwoQB = session.getSearchFactory().buildQueryBuilder().forEntity(EntityTwo.class).get();
QueryBuilder entityThreeQB = session.getSearchFactory().buildQueryBuilder().forEntity(EntityThree.class).get();
// Create 3 exact (except for which entity they point at) queries
Query entityOneQuery = myQueryBuilder.buildMyQuery(entityOne);
Query entityTwoQuery = myQueryBuilder.buildMyQuery(entityTwo);
Query entityThreeQuery = myQueryBuilder.buildMyQuery(entityThree);
其中 buildMyQuery() 有许多子查询,但处理 taxId 的子查询看起来像:
qb.bool().should(
qb.keyword()
.onField("taxId")
.matching(taxId)
.createQuery()
);
但是,现在,由于 entityOne 没有 taxId 作为索引列/字段,createQuery() 会引发异常:
SearchException: Unable to find field taxId in EntityOne
我的问题是:
如果实体没有该字段,是否有办法告诉 Lucene 忽略该字段?
1234563 '不包含在整体查询中?
【问题讨论】:
标签: java elasticsearch lucene hibernate-search