ElasticSearch 학습 노트 - Vector 벡터 검색 기록
6269 단어 ElasticSearchelasticsearchvector
dense_vector 는 조밀 한 벡터 를 저장 하고 value 는 단일 한 float 수치 로 0, 음수 또는 양수, dense 일 수 있 습 니 다.vector 배열 의 최대 길 이 는 1024 를 초과 할 수 없 으 며, 문서 마다 배열 길이 가 다 를 수 있 습 니 다.
sparse_vector 는 희소 벡터 를 저장 하고 value 는 단일 한 float 수치 로 0, 음수 또는 양수, sparse 일 수 있 습 니 다.vector 는 끼 워 넣 지 않 은 형식의 json 대상 을 저장 합 니 다. key 는 벡터 의 위치, 즉 integer 형식의 문자열, 범위 [0, 65535] 입 니 다.
ElasticSearch 버 전: elasticsearch - 7.3.0
환경 준비:
curl -H "Content-Type: application/json" -XPUT 'http://192.168.0.1:9200/article_v1/' -d '
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"dynamic": "strict",
"properties": {
"id": {
"type": "keyword"
},
"title": {
"analyzer": "ik_smart",
"type": "text"
},
"title_dv": {
"type": "dense_vector",
"dims": 200
},
"title_sv": {
"type": "sparse_vector"
}
}
}
}
'
테스트 인증 코드:
# -*- coding:utf-8 -*-
import os
import sys
import jieba
import logging
import pymongo
from elasticsearch import Elasticsearch
from elasticsearch.serializer import TextSerializer, JSONSerializer
from gensim.models.doc2vec import TaggedDocument, Doc2Vec
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s', level=logging.INFO)
#
client = pymongo.MongoClient(host='192.168.0.1', port=27017)
db = client['news']
es = Elasticsearch([{'host': '192.168.0.1', 'port': 9200}], timeout=3600)
chinese_stop_words_file = os.path.abspath(os.getcwd() + os.sep + '..' + os.sep + 'static' + os.sep + 'dic' + os.sep + 'chinese_stop_words.txt')
chinese_stop_words = [line.strip() for line in open(chinese_stop_words_file, 'r').readlines()]
total_cut_word_count = 0
#
def sentence_segment(sentence):
global total_cut_word_count
result = []
cut_words = jieba.cut(sentence)
for cut_word in cut_words:
if cut_word not in chinese_stop_words:
result.append(cut_word)
total_cut_word_count += 1
return result
#
def prepare_doc_corpus():
datas = db['netease_ent_news_detail'].find({"create_time": {"$ne": None}}).sort('create_time', pymongo.ASCENDING)
print datas.count()
for i, data in enumerate(datas):
if data['title'] is not None and data['content'] is not None:
title = str(data['title']).strip()
yield TaggedDocument(sentence_segment(title), [data['_id']])
#
def train_doc_model():
corpus = prepare_doc_corpus()
doc2vec = Doc2Vec(vector_size=200, min_count=2, window=5, workers=4, epochs=20)
doc2vec.build_vocab(corpus)
doc2vec.train(corpus, total_examples=doc2vec.corpus_count, epochs=doc2vec.epochs)
doc2vec.save('doc2vec.model')
def insert_data_to_es():
datas = db['netease_ent_news_detail'].find({"create_time": {"$ne": None}}).sort('create_time', pymongo.ASCENDING)
print datas.count()
doc2vec = Doc2Vec.load('doc2vec.model')
for data in datas:
if data['title'] is not None and data['content'] is not None:
sentence = str(data['title']).strip()
title_dv = doc2vec.infer_vector(sentence_segment(sentence)).tolist()
body = {"id": data['_id'], "title": data['title'], "title_dv": title_dv}
es_result = es.create(index="article_v1", doc_type="_doc",
id=data['_id'], body=body, ignore=[400, 409])
print es_result
# cosineSimilarity dense_vector
def search_es_dense_vertor_1(sentence):
doc2vec = Doc2Vec.load('doc2vec.model')
query_vector = doc2vec.infer_vector(sentence_segment(sentence)).tolist()
body = {
"query": {
"script_score": {
"query": {
"match_all": {}
},
"script": {
"source": "cosineSimilarity(params.queryVector, doc['title_dv']) + 1",
"params": {
"queryVector": query_vector
}
}
}
},
"from": 0,
"size": 5
}
result = es.search(index="article_v1", body=body)
hits = result['hits']['hits']
for hit in hits:
source = hit['_source']
for key, value in source.items():
print '%s %s' % (key, value)
print '----------'
# dotProduct
def search_es_dense_vertor_2(sentence):
doc2vec = Doc2Vec.load('doc2vec.model')
query_vector = doc2vec.infer_vector(sentence_segment(sentence)).tolist()
body = {
"query": {
"script_score": {
"query": {
"match_all": {}
},
"script": {
"source": "dotProduct(params.queryVector, doc['title_dv']) + 1",
"params": {
"queryVector": query_vector
}
}
}
},
"from": 0,
"size": 5
}
result = es.search(index="article_v1", body=body)
hits = result['hits']['hits']
for hit in hits:
source = hit['_source']
for key, value in source.items():
print '%s %s' % (key, value)
print '----------'
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Elasticsearch에서 소스 코드 찾기 Code App최근 추가된 Kibana의 Code App에서는 Github나 Gitlab 등의 리포지토리를 로드하고, Language Server를 사용하여 소스 코드를 해석, 코드나 변경 이력, 해석 결과도 인덱스에 모아줍니다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.