【发布时间】:2017-12-05 13:08:01
【问题描述】:
我有一个名为 my_index 的 Elasticsearch 索引,其中包含两种类型的文档,Type1 和 Type2。
- 这两种文档类型包含关于同一类型实体的不同数据。
- 这两种文档类型都包含相关实体的 ID。
我一直在尝试构建一个类似联接的查询,该查询将返回与两种文档类型的条件匹配的实体,但我无法让它工作,而且我在 Elasticsearch multi 中也找不到任何引用- 类型或查询说明不可能的文档。
我要解决的问题是通过获取所有 Type1 匹配项和所有 Type2 匹配项并在 Elasticsearch 之外进行连接,从而避免手动连接两个结果集,因为索引包含数百万个文档.
SQL 中的等价物是
select * from
Type1 inner join Type2
on Type2.EntityId = Type1.EntityId
where
Type1.Field = Condition AND
Type2.Field = Condition [...]
我用来查询的 URL 是 http://elastic/my_index/Type1,Type2/_search 以包含两种文档类型。
如果我对该 URL 执行空白查询,我会得到 Type1 和 Type2 的命中。
如果我为 Type1 添加一个标准,它会按预期工作:
{ "query": {
"bool": {
"must": [{
"term": {
"FieldOnType1": "lorem" } } ] } } }
Elasticsearch 可以通过某种方式推断 FieldOnType1 确实是 Type1 上的一个字段。
当我为 Type2 添加条件时,我没有得到任何命中:
{ "query": {
"bool": {
"must": [{
"term": {
"FieldOnType1": "lorem" } }, {
"term": {
"FieldOnType2": "ipsum" } } ] } } }
实际上,有时有超过 2 个词条查询,或者范围查询和词条查询。
我猜上述查询的问题是没有一个文档可以同时匹配这两个条件。
我试过了
- 用
should代替must,我试过了 - 用类型名限定字段名,我试过了
- 查询的许多变体(包括使用过滤器而不是查询)
但一切都给了我 0 次点击。
此处的类似问题建议使用 Elasticsearch 多搜索 API 而不是搜索 API,但这并不能解决我的“手动加入”问题。
有没有办法进行复杂的“OR”查询,允许对这两种类型进行查询?还是别的什么?
【问题讨论】:
-
带有 should 的 bool 查询应该适合您。请发布您尝试过的确切查询。此外,请检查仅在对 type2 运行查询时获得结果
标签: elasticsearch