我有一个名为my_index
的Elasticsearch索引,其中包含两种类型的文档:Type1
和Type2
。
我一直在尝试构建类似连接的查询,它会返回符合两种文档类型条件的实体,但我无法使其工作,我也无法找到Elasticsearch多类型或查询文档中的任何引用都表明它是不可能的。
我试图解决的问题是通过获取所有Type1匹配和所有Type2命中并在Elasticsearch之外进行连接来避免手动连接两个结果集,因为索引有数百万个文档< /强>
SQL中的等价物是
select * from
Type1 inner join Type2
on Type2.EntityId = Type1.EntityId
where
Type1.Field = Condition AND
Type2.Field = Condition [...]
我用来查询的网址是http://elastic/my_index/Type1,Type2/_search
,以包含这两种文档类型。
如果我对此网址执行空白查询,我会收到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,但这不会解决我的手动加入问题。问题
有没有办法精心制作&#34; OR&#34;查询将允许两种类型的查询?或其他什么?
答案 0 :(得分:0)
尝试multi_match query(我使用ES 6,所以索引p /类型):
GET index1,index2/_search
{
"query":{
"multi_match": {
"query": "1",
"fields": ["FieldOnType1", "FieldOnType2"]
}
}
}
如果您需要使用不同的字段, 应该有效:
GET test,test1/_search
{
"query":{
"bool": {
"should": [
{
"term": {"firstName": "john"}
},
{
"term": {"firstName1": "jerry1"}
}
]
}
}
}