gpt4 book ai didi

Elasticsearch join-like 多类型多字段查询

转载 作者:行者123 更新时间:2023-11-29 02:53:25 28 4
gpt4 key购买 nike

我有一个名为 my_index 的 Elasticsearch 索引,它包含两种类型的文档,Type1Type2

  • 这两种文档类型包含关于同一类型实体的不同数据。
  • 这两种文档类型都包含相关实体的 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,但这不能解决我的“手动加入”问题。

有没有一种方法可以进行复杂的“或”查询,以允许对两种类型进行查询?还是别的?

最佳答案

尝试 multi_match query (我使用 ES 6,所以有索引 p/type):

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"}
}
]
}
}
}

关于Elasticsearch join-like 多类型多字段查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47654412/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com