一、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"
}
}
]
}
-
field_value_factor:
field
: 指定用于计算得分的字段,在这里是 hot_count
字段。modifier
: 对 hot_count
字段值进行变换的修饰器,这里使用了log1p
修饰器。log1p
会对数值进行对数变换,使得数值差异较大的情况下得分差异不会太大。factor
: 是一个用于缩放field_value_factor
得分的系数,这里设置为 0.1。
-
score_mode: 控制多个
function
的得分如何组合。这里设置为"sum"
,表示多个得分函数的得分将被相加。 -
boost_mode: 控制
function_score
得分如何与原始查询得分进行组合。这里设置为"multiply"
,表示最终得分将是原始查询得分和function_score
得分的乘积。
综合起来,这段代码的作用是:
- 首先进行原始的文本匹配查询,计算出初步的相关性得分。
- 然后根据 hot
_count
字段值计算一个附加的得分因子,使用对数变换和系数缩放来控制得分范围。 - 最后将原始得分和附加得分相乘,得到最终的相关性得分。