elastic基操

一、elastic增加新字段操作

要在Elasticsearch的索引中添加新字段并为已有文档填充特定值,比如kibana中我的es索引名为A中原有字段name,bookid,并且填充了数据,“name”:“黎明”,"bookid":"1234",现在我要新增字段url,并把url填充为“url”:“http://”,步骤如下

1.首先需要向索引添加新字段,在Kibana的Dev Tools控制台中,可以使用以下命令:

PUT /A/_mapping
{
  "properties": {
    "url": {
      "type": "keyword" // 使用keyword类型,因为URL通常是精确匹配的
    }
  }
}

2.更新现有文档,使用API 来为所有已有文档的字段填充指定的URL值。在Kibana的Dev Tools控制台中,执行以下命令:

POST /A/_update_by_query
{
  "script": {
    "source": "ctx._source.url = 'https://www.g.com/b/r/359'",
    "lang": "painless"
  },
  "query": {
    "match_all": {}
  }
}

二、制作检索模版

参考:ElasticSearch的 search template搜索模板_elasticsearchtemplate.search-CS客san

POST _scripts/book_template
{
  "script": {
    "lang": "mustache",
    "source": {
      "timeout": "100ms",
      "_source": ["a", "b", "c"],
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "f": "{{query}}"
              }
            }
          ]
        }
      },
      "size": "{{#size}}{{size}}{{/size}}{{^size}}1{{/size}}"#只返回一条结果
    }
  }
}

三、给es导入数据

整个代码最重要的一行是es.index这行,id=doc_dict[]这个特别重要,在这里踩到坑了,导致es数据重复,[]这个括号里:1.一定是数据里的某个字段,2.且是唯一标识字段,这样插入数据时能通过这个id来过滤掉重复数据。

import os
import sys
import time
import datetime
import json
from elasticsearch import Elasticsearch

def main():
    es = Elasticsearch(['XXX',
                        'xxxx'])
    es_index_name = 'xxx'
    with open("xxx.txt") as f:
        for line in f.readlines():
            doc_dict = json.loads(line)
            for k, v in doc_dict.items():
                    doc_dict.update({k: v})

            try:
                # 首先检查文档是否已经存在
                if es.exists(index=es_index_name, id=doc_dict["id"]):
                    print(f"Document with id {doc_dict['id']} already exists, skipping.")
                   
                    continue
                #下面这句是插入es的核心,id=这个最重要!!!
                result = es.index(index=es_index_name, body=doc_dict, id=doc_dict["id"])
                print("Insert successfully:", doc_dict["id"])
            except Exception as e:
                print("Insert failed:", doc_dict["id"])
                print(repr(e))
            

if __name__ == '__main__':
    main()

再补充下liunx基本操作,Vim中的替换功能

:%s/old/new/g          " 替换文档中所有的'old'为'new'
:%s/old/new/gc         " 替换时每个实例都会要求确认

/是查找,n是向下翻页键,N是向上翻页键

四、es文档匹配性评分,满足A\B\C任意一个字段,结果按hot排序,如果query是完整的字段,并完全匹配的结果放在第一,其他结果按hot排序。

GET /XX/_search
{
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "A": {
                  "query": "宫崎骏风格画作",
                  "boost": 5
                }
              }
            },
            {
              "match": {
                "B": "宫崎骏风格画作"
              }
            },
            {
              "match": {
                "C": "宫崎骏风格画作"
              }
            }
          ]
        }
      },
      "functions": [
        {
          "field_value_factor": {
            "field": "hot_count",
            "modifier": "log1p",
            "factor": 0.1
          }
        }
      ],
      "score_mode": "sum",
      "boost_mode": "multiply"
    }
  },
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    }
  ]
}
  1. field_value_factor:

    • field: 指定用于计算得分的字段,在这里是 hot_count 字段。
    • modifier: 对 hot_count 字段值进行变换的修饰器,这里使用了 log1p 修饰器。log1p 会对数值进行对数变换,使得数值差异较大的情况下得分差异不会太大。
    • factor: 是一个用于缩放 field_value_factor 得分的系数,这里设置为 0.1。
  2. score_mode: 控制多个 function 的得分如何组合。这里设置为 "sum",表示多个得分函数的得分将被相加。

  3. boost_mode: 控制 function_score 得分如何与原始查询得分进行组合。这里设置为 "multiply",表示最终得分将是原始查询得分和 function_score 得分的乘积。

综合起来,这段代码的作用是:

  1. 首先进行原始的文本匹配查询,计算出初步的相关性得分。
  2. 然后根据 hot_count 字段值计算一个附加的得分因子,使用对数变换和系数缩放来控制得分范围。
  3. 最后将原始得分和附加得分相乘,得到最终的相关性得分。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值