标签: elasticsearch-dsl

使用现有字段作为 _id 使用 elasticsearch dsl python DocType

我有课,我尝试在其中设置student_id_id字段. 我指的是来自 elasticsearch-dsl 文档的持久示例

from elasticsearch_dsl import DocType, String

ELASTICSEARCH_INDEX = 'student_index'

class StudentDoc(DocType):
    '''
    Define mapping for Student type
    '''

    student_id = String(required=True)
    name = String(null_value='')

    class Meta:
        # id = student_id
        index = ELASTICSEARCH_INDEX
Run Code Online (Sandbox Code Playgroud)

我通过设置绑定idMeta但它不起作用。

我得到解决方案作为覆盖save方法,我实现了这个

def save(self, **kwargs):
    '''
    Override to set metadata id
    '''
    self.meta.id = self.student_id
    return super(StudentDoc, self).save(**kwargs)
Run Code Online (Sandbox Code Playgroud)

我正在创建这个对象

>>> a = StudentDoc(student_id=1, tags=['test'])
>>> a.save()
Run Code Online (Sandbox Code Playgroud)

有没有直接的方法可以从Meta没有覆盖 …

python elasticsearch elasticsearch-dsl

6
推荐指数
1
解决办法
3517
查看次数

将 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排序,找到最后X个条目

我正在尝试查找我的索引/文档类型中的最后 30 条条目

我什么也没尝试,我已经没有想法了!

我当前的方法是找到过去 5 分钟内的所有结果,然后过滤结果并抓取最后 30 个条目,但这比正确的方法慢。

s = Search(using=es, index="history", doc_type=p)
   .filter('range', timestamp={'gte': mins})
   .extra(size=1000)
Run Code Online (Sandbox Code Playgroud)

我已经尝试过

s = Search(using=es, index="history", doc_type=p)
   .sort("timestamp", {'order': "desc"})
   .extra(size=30)
Run Code Online (Sandbox Code Playgroud)

python elasticsearch-dsl elasticsearch-py

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

需要仅返回 Elasticsearch 中具有完整父主体的匹配嵌套对象

我在我的项目中使用 Elastic search 1.7 版本。我有一个名为的索引colleges,在该索引下有一个courses像这样的嵌套索引名称。

{ 
"name": "College Name"    
"university": "University Name",
"city": 429,
"city_name": "London",
"state": 328,
"state_name": "London",
"courses": [
     {
         "id": 26,
         "degree_name": "Master Of Technology",
         "annual_fee": 100000,
         "stream": "Engineering",
         "degree_id": 9419
     },  
     {
         "id": 28,
         "degree_name": "Master Of Philosophy",
         "annual_fee": 100000,
         "stream": "Philosophy",
         "degree_id": 9420
     }
]
}
Run Code Online (Sandbox Code Playgroud)

我正在做的是,我试图根据学院提供的嵌套的学院来state过滤degree_id学院courses。我想返回父对象的完整主体或所有字段colleges,即仅返回courses与查询匹配的字段。

我为完成任务而返回的查询是

{
   "_source": false,
   "query": {
      "bool": {
          "must": [
                {
                   "term": { …
Run Code Online (Sandbox Code Playgroud)

elasticsearch elasticsearch-dsl elasticsearch-query

5
推荐指数
0
解决办法
777
查看次数

Elasticsearch-dsl 嵌套查询

我在 Django 项目中使用 elasticsearch-dsl 库来索引数据,然后查询回来。

我有以下型号:

class Comments(models.Model):

    comment_id = models.CharField(max_length=1000,blank=True,null=True)
    user_post_id = models.ForeignKey('UserPosts',null=True)
    score =  models.CharField(max_length=1000,blank=True,null=True)
    text = models.TextField(blank=True,null=True)
    creation_date = models.CharField(max_length=1000,blank=True,null=True)


    def __unicode__(self):
        return self.comment_id

    def indexing(self):


        obj = CommentsIndex(
            meta={'id': self.id},
            comment_id=self.comment_id,
            user_post_id=self.user_post_id,
            score=self.score,
            text=self.text,
            creation_date=self.creation_date,
        )
        obj.save(index='comments-index')
        return obj.to_dict(include_meta=True)


class UserPosts(models.Model):

    user_post_id = models.CharField(max_length = 1000 , blank = True , null = True)
    user_post_type_id = models.CharField(max_length = 1000 , blank = True , null = True)
    accepted_answer_id = models.CharField(max_length = 1000 , blank = True …
Run Code Online (Sandbox Code Playgroud)

python django elasticsearch elasticsearch-dsl

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

ElasticSearch-dsl 创建查询

大家好:

我已经尝试使用 ElasticSearch-dsl Search() 类复制此查询很长一段时间,但不幸的是我无法得到它。

我想要复制的查询是:

{
    "_source": {
            "includes": [ "SendingTime","Symbol","NoMDEntries","*"]
        },
        "from" : 0, "size" : 10000,
  "query": {
    "bool": {
      "must": [
        {
            "range": {
            "SendingTime": {
              "gte": "Oct 3, 2018 08:00:00 AM",
              "lt": "Oct 3, 2018 02:00:59 PM"
            }
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

日期时间最终将被变量替换。

到目前为止我唯一能做的就是:

search = Search(using=elastic_search, index="bcs-md-bmk-prod")\
    .query("bool", range= {"SendingTime" : {'gte': format_date(datetime.now() - relativedelta(days=1)), 'lt': format_date(datetime.now())}})\
Run Code Online (Sandbox Code Playgroud)

我知道我离我想要的东西还很远,所以如果有人能帮助我,我将不胜感激。

python elasticsearch elasticsearch-dsl

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

内部对象之间的 Elasticsearch 查询时间戳差异

我有一个嵌套的数据类型,我想在它们的内部对象中进行计算,如果它们满足两个内部对象中的条件,我基本上希望我的搜索返回命中,棘手的条件是检索它们各自的时间戳值作为查询并使用它们来生成命中给定它们之间所需的时间差。

以这个单一文件为例:

{
  "messages": [
    [
      {
        "message": "First message",
        "timeStamp": "0:00:00"
      },
      {
        "message": "Second message",
        "timeStamp": "0:10:00"
      },
      {
        "message": "Third message",
        "timeStamp": "0:15:00"
      },
      {
        "message": "Fourth message",
        "timeStamp": "0:30:00"
      },
      {
        "message": "Fifth message",
        "timeStamp": "1:00:00"
      }
    ]
  ]
}
Run Code Online (Sandbox Code Playgroud)

如果消息包含文本Second并且在彼此Third相隔5 分钟内找到不同内部对象上的文本,我希望返回我的命中。如果我将它们的时间戳直接添加为查询的一部分,我可以轻松实现此查询,但此查询必须针对不同的时间戳数据运行。

{
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "must": [
              {
                "nested": {
                  "path": "messages",
                  "query": {
                    "bool": {
                      "must": [
                        {
                          "match": {
                            "messages.message": "Second" …
Run Code Online (Sandbox Code Playgroud)

subquery elasticsearch elasticsearch-dsl

5
推荐指数
0
解决办法
74
查看次数

按星期几和时间过滤 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 从每个类别中选择一个得分最高的产品

我正在尝试查询包含产品信息的ES索引,其中包含product_id、category_id和variant_id字段。每个产品都属于特定类别和变体:

{
    "product_id" : "PRODUCT_12345",
    "category_id" : 1,
    "variant_id" : 5
}
Run Code Online (Sandbox Code Playgroud)

我还有 Product_id 及其分数列表:

[{'product_id': 'PRODUCT_46831', 'score': 1}, {'product_id': 'PRODUCT_47139', 'score': 0.95}, {'product_id': 'PRODUCT_46833', 'score': 0.8999999999999999}, {'product_id': 'PRODUCT_46834', 'score': 0.8499999999999999}, {'product_id': 'PRODUCT_46835', 'score': 0.7999999999999998}]

这些分数是使用算法计算的,每个 Product_id 都存在于 ES 中。我想过滤列表,以便从每个类别和变体中仅选择一种产品。应从每个类别和变体中选择得分最高的产品。因此,对于上面的列表,如果PRODUCT_46831, PRODUCT_47139, PRODUCT_46833属于category 1. PRODUCT_46834, PRODUCT_46835属于category 2PRODUCT_46831, PRODUCT_46834属于variant 1PRODUCT_46833, PRODUCT_47139, PRODUCT_46835属于variant 2,类别分组将创建列表[PRODUCT_46831, PRODUCT_46834],因为PRODUCT_46831, PRODUCT_46834这些类别中得分最高的产品:

对variant_id进一步分组PRODUCT_46831, PRODUCT_46834将创建结果:

[PRODUCT_46831]

因为PRODUCT_46831, PRODUCT_46834 …

elasticsearch elasticsearch-dsl elasticsearch-aggregation

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

使用 python 和 elasticsearch 进行 knn 搜索查询

我尝试使用 elasticsearch python 客户端执行此查询:

curl -X GET "localhost:9200/articles/_knn_search" -H 'Content-Type: application/json' -d '
{
  "knn": {
    "field": "title_vector",
    "query_vector": [-0.01807806, 0.024579186,...],
    "k": 10,
    "num_candidates": 100
  },
  "_source": ["title", "category"]
}
'
Run Code Online (Sandbox Code Playgroud)

如果有人可以帮助我谢谢。

编辑:对于elasticsearch python客户端> 8.0,有一个名为knn_search的新函数,因此我们可以非常轻松地运行knn_search:

query = {
    "field": "title_vector",
    "query_vector": [-0.01807806, 0.024579186,...],
    "k": 10,
    "num_candidates": 100
}
es = Elasticsearch(request_timeout=600, hosts='http://localhost:9200')
res = es.knn_search(index="index_name", knn=query, source=["filed1", "field2"])
Run Code Online (Sandbox Code Playgroud)

python nlp elasticsearch word2vec elasticsearch-dsl

5
推荐指数
0
解决办法
3316
查看次数