我正在使用Elasticsearch DSL,我想对结果进行分页.为此,我需要知道搜索结果的总数.我该怎么做才能做到最好?
我是否进行了一次搜索,然后执行两次,一次是针对.hits.total另一种针对项目进行切片?像这样的东西:
response = Link.search().filter("term", run_id=run_id)
total = response.execute().hits.total
links = response[start:end].execute()
Run Code Online (Sandbox Code Playgroud) 我想创建这个例子
GET /my_store/products/_search
{
"query" : {
"filtered" : {
"query" : {
"match_all" : {}
},
"filter" : {
"term" : {
"price" : 20
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用Pythons elasticsearch_dsl.
import elasticsearch as ES
import elasticsearch_dsl as dsl
from elasticsearch_dsl import Search
client = ES.Elasticsearch() # i'm using the localhost default client
s = Search(using = client, index = "my_store")
Run Code Online (Sandbox Code Playgroud)
好的,这指定了主机,端口和索引.
s = s.filter("term", price = 20)
results = s.execute().to_dict()
Run Code Online (Sandbox Code Playgroud)
但是如何指定文档类型是"产品"?似乎在Search()函数中应该有一个参数.
类似的问题,假设我想运行相同的查询,但我希望它运行索引"my_store"和"her_store".我该如何指定?
我有一个关于 Elasticsearch DSL 的问题。
我想进行全文搜索,但将可搜索记录的范围限定为特定的数据库 ID 数组。
在 SQL 世界中,它的功能相当于WHERE id IN(1, 2, 3, 4).
我一直在研究,但我发现 Elasticsearch 查询 DSL 文档有点神秘并且缺乏有用的示例。任何人都可以指出我正确的方向吗?
我想通过嵌套对象进行过滤来构建过滤后的Elasticsearch查询,并进行聚合以获取嵌套对象列表中嵌套对象的最小值。
过滤部分有效,但我无法将其与aggs(聚合)部分绑定。当我将.aggs.bucket部分添加到过滤器之后的代码中时,它要么被忽略(在中不可见search.to_dict()),要么给我语法错误。
谁能给我一个如何将它们捆绑在一起的例子吗?我正在尝试使两个过滤的查询结果都nested1.foo.bar在一个响应中结束计算的最小值
模式示例:
class MyExample(DocType):
myexample_id = Integer()
nested1 = Nested(
properties={
'timestamp': Date(),
'foo': Nested(
properties={
'bar': Float(),
}
)
}
)
nested2 = Nested(
multi=False,
properties={
'x': String(),
'y': String(),
}
)
Run Code Online (Sandbox Code Playgroud)
建立查询:
from elasticsearch_dsl import Search, Q
search = Search().filter(
'nested', path='nested1', inner_hits={},
query=Q(
'range', **{
'nested1.timestamp': {
'gte': exampleDate1,
'lte': exampleDate2
}
}
)
).filter(
'nested', path='nested2', inner_hits={'name': 'x'},
query=Q(
'term', **{
'nested2.x': x
}
)
).filter(
'nested', path='nested2', …Run Code Online (Sandbox Code Playgroud) 希望将CSV文件索引到ElasticSearch,而不使用Logstash.我正在使用elasticsearch-dsl高级库.
给定带标题的CSV,例如:
name,address,url
adam,hills 32,http://rockit.com
jane,valleys 23,http://popit.com
Run Code Online (Sandbox Code Playgroud)
按字段索引所有数据的最佳方法是什么?最终我想让每一行看起来像这样
{
"name": "adam",
"address": "hills 32",
"url": "http://rockit.com"
}
Run Code Online (Sandbox Code Playgroud) 我正在使用elasticsearch-dsl python库连接到elasticsearch并进行聚合。
我正在关注代码
search.aggs.bucket('per_date', 'terms', field='date')\
.bucket('response_time_percentile', 'percentiles', field='total_time',
percents=percentiles, hdr={"number_of_significant_value_digits": 1})
response = search.execute()
Run Code Online (Sandbox Code Playgroud)
这工作正常,但仅返回10个结果 response.aggregations.per_ts.buckets
我想要所有结果
我试图用一种溶液size=0中提到了这个问题
search.aggs.bucket('per_ts', 'terms', field='ts', size=0)\
.bucket('response_time_percentile', 'percentiles', field='total_time',
percents=percentiles, hdr={"number_of_significant_value_digits": 1})
response = search.execute()
Run Code Online (Sandbox Code Playgroud)
但这会导致错误
TransportError(400, u'parsing_exception', u'[terms] failed to parse field [size]')
Run Code Online (Sandbox Code Playgroud) 无痛脚本映射参数中存在如何检查密钥。在下面的查询中,查询检查a.toString()键存在于参数中,我已经尝试了所有方法,但没有使它起作用。请帮我
映射:
"id": {
"type": "long"
}
Run Code Online (Sandbox Code Playgroud)
查询:
{
"query":{
"bool":{
"filter":[
{
"script": {
"script": {
"lang": "painless",
"params": {
"29232":2541,
"minDistance": 0
},
"source": "def a=doc['id'].getValue();double distance=params[a.toString()]; return distance <= 1000 && distance >= params['minDistance']"
}
}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud) 我在 Elasticsearch 中有一个企业索引。索引中的每个文档代表一个企业,每个企业都有business_hours。我试图允许使用星期几和时间来过滤营业时间。例如,我们希望能够做一个过滤器来显示周二晚上 6:00PM 之后开放的所有业务, 我认为我们应该有一个具有以下映射的字段:
{
"mappings": {
"properties": {
"business_hours": {
"type": "date_range",
"format": "w'T'hh:mma"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
每个文档都会有一个business_hours 数组。因此,周一上午 9:00 - 下午 5:00 和周二上午 9:30 - 下午 5:00 营业的商店将如下所示:
POST my-index/_doc
{
"name": "My Store",
"business_hours": [
{
"gte": "1T09:00AM",
"lte": "1T05:00PM"
},
{
"gte": "2T09:30AM",
"lte": "2T05:00PM"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我尝试搜索此文档并查询它,但是时间过滤器不起作用,它们看起来像是被忽略了......Elasticsearch 是否支持按一周中的某一天进行过滤,或者是否需要是实际的日期时间?
这是我使用的查询。它应该过滤周三营业的营业时间,但它返回了上面的文件,其中只有周一和周二的营业时间
GET my-index/_search
{
"query": {
"bool": {
"filter": [
{
"range": {
"business_hours": {
"gte": "3T10:00AM",
"lte": "3T05:00PM",
"relation": "CONTAINS"
} …Run Code Online (Sandbox Code Playgroud) 根据docs,这应该足够了:
"settings": {
"index.mapping.ignore_malformed": true
}
Run Code Online (Sandbox Code Playgroud)
但是如何在 python 包装器上实现这一点呢?我当前的代码如下所示:
from elasticsearch_dsl import Index
index = Index('my_index', my_conn)
index.settings(
number_of_shards=ES_NUMBER_OF_SHARDS,
number_of_replicas=ES_NUMBER_OF_REPLICAS
)
index.create()
Run Code Online (Sandbox Code Playgroud) python python-2.7 elasticsearch elasticsearch-dsl elasticsearch-py
有人可以指出我_source在 elasticsearch dsl python 客户端中使用扫描 API 时如何从生成器中提取结果吗?
例如,我正在使用(从这个例子中,elasticsearch-dsl scan)
for hit in s.scan():
print(hit)
Run Code Online (Sandbox Code Playgroud)
我得到以下
<Hit(beacon/INDEX/_Mwt9mABoXXeYV0uwSC-): {'client_number': '3570', 'cl...}>
Run Code Online (Sandbox Code Playgroud)
如何从命中生成器中提取字典?