标签: elasticsearch-dsl

使用elasticsearch-dsl-py进行范围聚合

POST /_search
{
"size": 0,
"aggs": {
    "by_grp" : {
        "terms": {
            "field": "grpId",
            "size": 0
        },
        "aggs": {
            "twitter_count": {
                "range": {
                    "field": "twitter.followers",
                    "ranges": [
                        { "to" : 501},
                        { "from" : 501, "to" : 1001},
                        { "from" : 1001, "to" : 5001},
                        { "from" : 5001}
                    ]
                },
                "aggs" : {
                    "email_addy": {
                        "terms" : {
                            "field": "email.value",
                            "size": 0
                        }
                    }
                }
            }
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

使用elastic-search-dsl,我的python代码是

from datetime import datetime
from elasticsearch_dsl import DocType, …
Run Code Online (Sandbox Code Playgroud)

python curl python-2.7 elasticsearch-dsl

2
推荐指数
1
解决办法
3452
查看次数

从Elasticsearch的索引中仅获取过滤的嵌套对象

我有一个包含嵌套对象的文档,如下所示:

{
    "title" : "Title 1",
    "books": [{
        "book_title": "b title 1",
        "year": 2014
    }, {
        "book_title": "b title 2",
        "year": 2015
    }]
}
Run Code Online (Sandbox Code Playgroud)

现在,我需要按书名(不是book_title)和年份(比如2014)过滤图书。我需要的输出将是:

{
    "title" : "Title 1",
    "books": [{
        "book_title": "b title 1",
        "year": 2014
    }]
}
Run Code Online (Sandbox Code Playgroud)

当我使用嵌套过滤器时,即使它们不匹配,我也会得到所有嵌套对象。如何仅获取匹配的嵌套对象?

elasticsearch elasticsearch-dsl

2
推荐指数
1
解决办法
233
查看次数

Python elasticsearch dsl搜索多字段并排序结果

我如何在 elasticsearch dsl python 模块中搜索多个字段,例如titlebody字段,并按字段 DESC 对其进行排序created_at

我有一个仅在字段中搜索的示例title

q = request.GET.get('q', None)
s = Search(using=elastic_client, index='post').query('match', title=q)
response = s.execute()
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

python pyelasticsearch elasticsearch-dsl

2
推荐指数
1
解决办法
5606
查看次数

如何使用 python 的 elasticsearch DSL 访问响应对象

我有以下代码:

s = Search(using=Elasticsearch('http://user:passwd@ipaddress'), index="myindex")
q = Q("multi_match", query='some query', fields=['_all'])
s = s.query(q)

response = s.execute()
print('Total %d hits found.' % response.hits.total)
for hit in response:
    print(hit.title)
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/elasticsearch_dsl/utils.py", line 102, in __getattr__
return _wrap(self._d_[attr_name])
KeyError: 'title'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "FindImage.py", line 89, in <module>
main(args.image_file)
File "FindImage.py", line 82, in main
query_db([1], [2])
File "FindImage.py", line 77, in query_db
print(hit.title) …
Run Code Online (Sandbox Code Playgroud)

python elasticsearch elasticsearch-dsl

2
推荐指数
1
解决办法
5081
查看次数

Python elasticsearch-dsl 多字段排序

我正在尝试使用 elasticsearch-dsl 形成用于排序的命令。但是我无法以正确的格式传递变量。

格式应该是

s=Search()
s = s.sort({"time":{"order":"asc"}}, {"anoter_field":{"order":"desc"}})
s.execute()
Run Code Online (Sandbox Code Playgroud)

问题是我试图把它{"time":{"order":"asc"}}, {"anoter_field":{"order":"desc"}}作为一个变量,但我似乎无法以正确的语法得到它。我尝试使用 dict、list 和 string,但似乎都不起作用。

我的输入将是一个看起来像的字典

input = {"time":"asc", "another_field":"desc"}
Run Code Online (Sandbox Code Playgroud)

python elasticsearch-dsl

2
推荐指数
1
解决办法
1312
查看次数

elasticsearch_dsl:聚合生成多个bucket

我想生成这个:

GET /packets-2017-09-25/_search
{
  "size": 0,
  "query": {
        "match": {
            "transport_protocol": "tcp"
        }
  },
  "aggs": {
    "clients": {
      "terms": {
        "field": "layers.ip.src.keyword",
        "size": 1000,
        "order":{ "num_servers.value":"desc" }
      },
      "aggs": {
        "num_servers": {
          "cardinality": {
            "field": "layers.ip.dst.keyword",
            "precision_threshold" : 40000
          } 
        },
        "server_list": {
          "terms": {
            "field": "layers.ip.dst.keyword"
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

即我想要客户端下的两个存储桶 (num_servers) 和 (server_list)。

我正在尝试下面的代码,它出错了:

def get_streams_per_client(proto='tcp', max=40000):
    s = Search(using=client, index="packets-2017-09-25") \
               .query("match", transport_protocol=proto)
    s.aggs.bucket('clients', 'terms', field='layers.ip.src.keyword', size=max, order={"num_servers.value":"desc"})\
    .bucket('num_servers', 'cardinality', field='layers.ip.dst.keyword', precision_threshold=40000)\
    .bucket('server_list', 'terms', field='layers.ip.dst.keyword') …
Run Code Online (Sandbox Code Playgroud)

elasticsearch-dsl elasticsearch-dsl-py

2
推荐指数
1
解决办法
2033
查看次数

如何在 Elasticsearch 中将术语查询和布尔查询组合在一起

最初,我会filter在 bool 查询中添加一个。然而,当我转向 时terms filter文件表明它terms query现在应该被替换。所以,我理解这一点为我们需要构建既具有复合查询terms querybool query。如果我是正确的,我应该如何编写查询?

注意:我使用 elasticsearch 的 Python API。

elasticsearch elasticsearch-dsl elasticsearch-dsl-py

2
推荐指数
1
解决办法
1733
查看次数

如何将一个文档中的多个嵌套对象与elasticsearch中的内部命中进行匹配

如何编写包含两个搜索词的查询,这些搜索词与突出显示内部匹配的嵌套对象相匹配。

\n

以下是示例用例:

\n

我有一个映射:

\n
"mappings": {\n      "properties": {\n        "grocery_name": {\n          "type": "text"\n        },\n        "items": {\n          "type": "nested",\n          "properties": {\n            "name": {\n              "type": "text"\n            },\n            "stock": {\n              "type": "integer"\n            },\n            "category": {\n              "type": "text"\n            }\n          }\n        }\n      }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

数据如下所示

\n
{\n  "grocery_name": "Elastic Eats",\n  "items": [\n    {\n      "name": "Red banana",\n      "stock": "12",\n      "category": "fruit"\n    },\n    {\n      "name": "Cavendish banana",\n      "stock": "10",\n      "category": "fruit"\n    },\n    {\n      "name": "peach",\n      "stock": "10",\n      "category": "fruit"\n    },\n    {\n      "name": "carrot",\n      "stock": "9",\n …
Run Code Online (Sandbox Code Playgroud)

lucene elasticsearch elasticsearch-dsl nested-object

2
推荐指数
1
解决办法
2907
查看次数

使用 PIT(时间点)ID 和 Search_After API -NEST ElasticSearch

我一直在阅读Point in time API,并希望在我的.net 应用程序中使用 NEST 来实现它。然而,在阅读那篇文章(.net 应用程序超链接)时,我看到了如下所示的 Fluent DSL 示例。有没有一种方法可以找到该 ID,而无需转到控制台上的 kibana 并进行查询搜索来获取 id,然后将该 id 放入“a-point-in-time-id”中?或者“a-point-in-time-id”是否会为您执行此操作,就像映射到 ID 一样?

s => s
.PointInTime("a-point-in-time-id", p => p
.KeepAlive("1m"))
Run Code Online (Sandbox Code Playgroud)

我知道在 kibana cli 控制台中如果您这样做:

POST /app-logs*/_pit?keep_alive=5m它会给你一个 PIT(时间点)ID。你如何在 NEST 中检索它?

当阅读search_after并尝试使用 Fluent DSL 示例在 .net 客户端使用后的搜索来实现它时。我注意到他们有“项目”一词,但没有说明示例中的“项目”是什么。那到底是什么?

s => s
.Sort(srt => srt
    .Descending(p => p.NumberOfCommits)
    .Descending(p => p.Name)
)
.SearchAfter(
    Project.First.NumberOfCommits,
    Project.First.Name
)
Run Code Online (Sandbox Code Playgroud)

在这里,我尝试实现.PointInTime()and .Sort().SearchAfter()但卡住了。

var response = await …
Run Code Online (Sandbox Code Playgroud)

c# console-application elasticsearch nest elasticsearch-dsl

2
推荐指数
1
解决办法
3362
查看次数

Elasticsearch 中匹配与术语查询的性能?

我在我的项目中使用了很多match查询。现在,我刚刚面临termElasticsearch 中的查询。如果指定了查询的关键字,则术语查询似乎会更快。现在我有一个问题..我应该重构我的代码(很多)并使用 term 而不是 match 吗?使用 term 的性能比 match 好多少?

在我的查询中使用术语:

main_query["query"]["bool"]["must"].append({"term":{object[..]:object[...]}})
Run Code Online (Sandbox Code Playgroud)

在我的查询中使用匹配查询:

main_query["query"]["bool"]["must"].append({"match":{object[..]:object[...]}})
Run Code Online (Sandbox Code Playgroud)

elasticsearch elasticsearch-dsl

2
推荐指数
1
解决办法
2565
查看次数