标签: elasticsearch-dsl

如何在Python中对Elasticsearch DSL的结果进行分页

我正在使用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)

elasticsearch elasticsearch-dsl

5
推荐指数
1
解决办法
3891
查看次数

使用elasticsearch_dsl(Python)时如何指定文档类型?同样,如何指定几个指数?

我想创建这个例子

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".我该如何指定?

python elasticsearch-dsl

5
推荐指数
1
解决办法
1852
查看次数

将 Elasticsearch 结果范围限定为特定 ID

我有一个关于 Elasticsearch DSL 的问题。

我想进行全文搜索,但将可搜索记录的范围限定为特定的数据库 ID 数组。

在 SQL 世界中,它的功能相当于WHERE id IN(1, 2, 3, 4).

我一直在研究,但我发现 Elasticsearch 查询 DSL 文档有点神秘并且缺乏有用的示例。任何人都可以指出我正确的方向吗?

elasticsearch elasticsearch-rails elasticsearch-dsl

5
推荐指数
1
解决办法
3486
查看次数

带有嵌套属性的过滤器和聚合的Elasticsearch DSL python查询

我想通过嵌套对象进行过滤来构建过滤后的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)

python elasticsearch elasticsearch-dsl

5
推荐指数
1
解决办法
1513
查看次数

在Python中将CSV索引到ElasticSearch

希望将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)

python csv elasticsearch python-3.5 elasticsearch-dsl

5
推荐指数
1
解决办法
1万
查看次数

elasticsearch-dsl聚合仅返回10个结果。如何改变这个

我正在使用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)

python elasticsearch elasticsearch-dsl

5
推荐指数
2
解决办法
1841
查看次数

如何检查弹性搜索无痛参数中是否存在键?

无痛脚本映射参数中存在如何检查密钥。在下面的查询中,查询检查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 elasticsearch-dsl elasticsearch-painless

5
推荐指数
1
解决办法
220
查看次数

按星期几和时间过滤 Elasticsearch

我在 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)

elasticsearch elasticsearch-dsl

5
推荐指数
1
解决办法
1735
查看次数

通过ElasticSearch DSL python包装器创建索引时如何在索引级别设置ignore_malformed?

根据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

4
推荐指数
1
解决办法
2004
查看次数

elasticsearch dsl 扫描结果

有人可以指出我_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)

如何从命中生成器中提取字典?

python python-3.x elasticsearch-dsl elasticsearch-dsl-py

4
推荐指数
1
解决办法
3540
查看次数