我有一个名为 Elasticsearch 的索引my_index,其中包含两种类型的文档,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 [...]
Run Code Online (Sandbox Code Playgroud)
我用来查询的 URLhttp://elastic/my_index/Type1,Type2/_search包括这两种文档类型。
如果我对此 URL 执行空白查询,我会得到 Type1 和 Type2 的命中。
如果我为 Type1 添加一个标准,它会按预期工作:
{ "query": {
"bool": {
"must": [{
"term": {
"FieldOnType1": "lorem" } } ] } } }
Run Code Online (Sandbox Code Playgroud)
不知何故,Elasticsearch 可以推断 FieldOnType1 确实是 Type1 上的一个字段。
当我为 Type2 添加标准时,我没有得到任何命中:
{ "query": {
"bool": {
"must": [{
"term": {
"FieldOnType1": "lorem" } }, {
"term": {
"FieldOnType2": "ipsum" } } ] } } }
Run Code Online (Sandbox Code Playgroud)
实际上,有时会有超过 2 个词条查询,或者范围查询和词条查询。
我猜上面查询的问题是没有一个文档可以同时匹配这两个条件。
我试过了
should而不是must,我试过但一切都给了我 0 次点击。
这里的类似问题建议使用 Elasticsearch 多搜索 API 而不是搜索 API,但这并不能解决我的“手动连接”问题。
有没有办法制作一个允许对两种类型进行查询的精心制作的“OR”查询?或者是其他东西?
尝试multi_match 查询(我使用 ES 6,所以有索引 p/type):
GET index1,index2/_search
{
"query":{
"multi_match": {
"query": "1",
"fields": ["FieldOnType1", "FieldOnType2"]
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您需要使用不同的字段,应该可以:
GET test,test1/_search
{
"query":{
"bool": {
"should": [
{
"term": {"firstName": "john"}
},
{
"term": {"firstName1": "jerry1"}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3017 次 |
| 最近记录: |