ES(Elasticsearch)是一个分布式的全文搜索引擎,它可以帮助我们快速地存储、搜索和分析海量数据。在ES中,插入数据是我们使用ES的一个基本功能。本文将基于此,从多个方面对ES插入数据进行详细阐述。
一、ES插入数据带版本号
在ES中,我们通常会对数据进行版本管理,以便于在数据发生变化时能够及时更新。因此,我们可以利用ES提供的api,在插入数据时加入版本号。代码示例如下:
curl -XPUT 'http://localhost:9200/index/type/1?version=1' -d '{"name":"John","age":22}'
在这个例子中,我们使用curl命令向ES中插入数据,其中version=1表示版本号为1。如果我们在插入数据时版本号错误,那么ES将会返回错误信息。
值得注意的是,如果省略版本号,ES将默认将版本号设置为1。
二、ES手动插入数据
除了使用API插入数据外,我们还可以通过手动插入数据的方式,向ES中插入数据。下面是一段使用Python语言手动向ES中插入数据的代码示例:
from elasticsearch import Elasticsearch es = Elasticsearch(hosts="localhost", port=9200) # 插入一条数据 doc = {"name": "John", "age": 22} es.index(index="index", doc_type="type", id=1, body=doc)
在这个代码示例中,我们首先建立一个ES的连接(这里我们使用了Python中的elasticsearch库);然后通过index方法向ES中插入数据,其中index表示索引名称,type表示类型,id表示数据的唯一标识符,body表示数据的内容。通过这种方式,我们可以非常灵活地向ES中插入数据。
三、SQL插入CLOB数据
有时候我们需要向ES中插入较大的数据,比如一份大型文档或一整个网页。而在ES中,我们可以使用BLOB或CLOB类型的字段来存储这些大型数据。下面是一个使用SQL语句向ES中插入CLOB类型数据的示例:
INSERT INTO es_test VALUES(1, EMPTY_CLOB()); SELECT clob_column FROM es_test WHERE id = 1 FOR UPDATE; CALL dbms_lob.writeappend(clob_column, length(data), data);
在这个例子中,我们首先插入一条数据,其中id为1,clob_column为CLOB类型字段,初始值为空;然后通过SELECT语句查询这条数据,并使用dbms_lob.writeappend方法将数据写入CLOB类型字段中。
四、ES写入数据
ES提供了多种方式来向ES中写入数据,其中包括bulk、index、create等。下面是一个使用bulk方式向ES中写入数据的代码示例:
from elasticsearch import Elasticsearch es = Elasticsearch(hosts="localhost", port=9200) # 插入多条数据 docs = [ {"name": "John", "age": 22}, {"name": "Tom", "age": 24}, {"name": "Mary", "age": 20}, ] actions = [ {"_index": "index", "_type": "type", "_id": i, "_source": doc} for i, doc in enumerate(docs) ] es.bulk(actions)
在这个代码示例中,我们首先建立一个ES的连接;然后定义多个数据文档,并将它们存储到一个列表中;接着通过bulk方法向ES中插入数据,其中actions参数为一个列表,每个元素表示一条插入数据的操作指令(包括索引名称、类型、唯一标识符和数据内容)。通过这种方式,我们可以批量地向ES中插入数据,从而提高插入数据的效率。
五、ES数据导入
有时候我们需要从其他数据源中导入数据到ES中,比如从数据库、文件或其他搜索引擎中导入。ES提供了多种数据导入方式,其中包括使用Logstash、使用ES的API、使用ES的Java API等。下面是一个使用Logstash导入数据到ES的示例:
input { jdbc { jdbc_driver_library => "/path/to/mysql.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost/test" jdbc_user => "user" jdbc_password => "password" statement => "SELECT * FROM users WHERE id > :last_id ORDER BY id ASC" use_column_value => true tracking_column => "id" } } output { elasticsearch { hosts => ["localhost:9200"] index => "users" document_type => "user" document_id => "%{id}" } }
在这个例子中,我们首先配置Logstash,使其能够连接MySQL数据库,并从中读取数据;然后将数据导入到ES中,其中hosts表示ES的地址、index表示要导入到的索引名称、document_type表示用于区分不同类型数据的类型名称、document_id表示数据的唯一标识符。
六、Oracle插入列数据选取
如果我们需要将Oracle数据库中的列数据选取出来,然后插入到ES中,我们可以使用Python的Oracle驱动和elasticsearch库来实现。下面是一个使用Python将Oracle数据插入到ES的示例:
import cx_Oracle from elasticsearch import Elasticsearch es = Elasticsearch(hosts="localhost", port=9200) # 获取Oracle列数据 conn = cx_Oracle.connect("user/password@localhost:1521/orcl") cursor = conn.cursor() cursor.execute("SELECT name, age FROM users") data = cursor.fetchall() # 将数据插入到ES中 docs = [ {"name": name, "age": age} for name, age in data ] actions = [ {"_index": "index", "_type": "type", "_id": i, "_source": doc} for i, doc in enumerate(docs) ] es.bulk(actions)
在这个代码示例中,我们首先连接Oracle数据库,查询数据,并将数据存储到一个列表中;然后将数据插入到ES中,使用的方式与上一个示例是相同的(使用bulk方法批量插入数据)。
总之,ES插入数据是我们在使用ES时必定会涉及到的一个基本操作。通过本文的讲解,相信您对ES插入数据的相关知识已经更加了解,可以更加灵活地使用ES进行数据存储、搜索和分析。