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) 我有一个包含嵌套对象的文档,如下所示:
{
"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 dsl python 模块中搜索多个字段,例如title和body字段,并按字段 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)
我怎样才能做到这一点?
我有以下代码:
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) 我正在尝试使用 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) 我想生成这个:
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) 最初,我会filter在 bool 查询中添加一个。然而,当我转向 时terms filter,文件表明它terms query现在应该被替换。所以,我理解这一点为我们需要构建既具有复合查询terms query和bool query。如果我是正确的,我应该如何编写查询?
注意:我使用 elasticsearch 的 Python API。
如何编写包含两个搜索词的查询,这些搜索词与突出显示内部匹配的嵌套对象相匹配。
\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 }\nRun 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) 我一直在阅读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) 我在我的项目中使用了很多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)