如何用elasticsearch 作用5.2实现全文索引

elasticsearch5.2.1安装head步骤
elasticsearch5.2.1安装head步骤:1. 下载elasticsearch-head 下载地址:/mobz/elasticsearch-head。
2. 解压 unzip elasticsearch-head-master.zip
3. 安装需要node 如没有需要下载安装 下载地址 https://nodejs.org/dist/v5.10.1/node-v5.10.1-linux-x64.tar.gz
tar -xzvf node-v5.10.1-linux-x64.tar.gz
创建软连接
ln -s /home/node-v5.10.1-linux-x64/bin/node /usr/local/bin/node
ln -s /home/node-v5.10.1-linux-x64/bin/npm /usr/local/bin/npm
4. 到elasticsearch-head-master目录下,运行命令:
npm install
5. 如果速度较慢或者安装失败,可以使用国内镜像:
npm install -g cnpm --registry=https://registry.npm.taobao.org
6. 修改Elasticsearch配置文件
编辑elasticsearch/config/elasticsearch.yml,加入以下内容:
http.cors.enabled: true
http.cors.allow-origin: &*&
7. 打开elasticsearch-head-master/Gruntfile.js,找到下面connect属性,新增hostname: &*&:
connect: {
options: {
hostname: '*',
port: 9100,
base: '.',
keepalive: trueelasticsearch的5种分片查询优先级 -
- ITeye博客
elasticsearch可以使用preference参数来指定分片查询的优先级,使用时就是在请求url上加上preference参数,如:http://ip:host/index/_search?preference=_primary
java的调用接口翻译为:client.prepareSearch(“index”).setPreference(“_primary”)。
默认情况下es有5种查询优先级:
_primary: 指查询只在主分片中查询
_primary_first: 指查询会先在主分片中查询,如果主分片找不到(挂了),就会在副本中查询。
_local: 指查询操作会优先在本地节点有的分片中查询,没有的话再在其它节点查询。
_only_node:指在指定id的节点里面进行查询,如果该节点只有要查询索引的部分分片,就只在这部分分片中查找,所以查询结果可能不完整。如_only_node:123在节点id为123的节点中查询。
Custom (string) value:用户自定义值,指在参数cluster.routing.allocation.awareness.attributes指定的值,如这个值设置为了zone,那么preference=zone的话就在awareness.attributes=zone*这样的节点搜索,如zone1、zone2。关于这个值作用可以参考下面文章。
虽然es有提供这5种优先级,但感觉还是不能满足我的需求,我是想能指定在某一个或多个节点中查询,比如node1和node2里面的分片能组成一个完整的索引,那我可以只在node1和node2中搜索就行了。看来只能改源码解决,改源码也非常简单。
首先找到org.elasticsearch.cluster.routing.operation.plain.PlainOperationRouting这个类,es搜索时获取分片信息是通过这个类的。它的preferenceActiveShardIterator()方法就是根据条件来找出响应的分片。看源码可知其主要是根据preference这个参数来决定取出的分片的。如果没有指定该参数,就随机抽取分片进行搜索。如果参数以_shards开头,则表示只查询指定的分片。注意,这个功能官网的文档中没有写到。
然后下面就是判断我上面说的5种优先级情况。我们现在要加个多节点分片查询的功能,仿照单个节点分片查询(指_only_node)就行了,在
if (preference.startsWith("_only_node:")) {
return indexShard.onlyNodeActiveShardsIt(preference.substring("_only_node:".length()));
}
后面加上
if (preference.startsWith("_only_nodes:"))
return indexShard.onlyNodesActiveShardsIt(preference.substring("_only_nodes:".length()));
}
onlyNodesActiveShardsIt这个方法在org.elasticsearch.cluster.routing.IndexShardRoutingTable中是没有的,要自己写。加上
&&
* Prefers execution on the provided nodes if applicable.
public ShardIterator onlyNodesActiveShardsIt(String nodeIds) {
String[] ids = nodeIds.split(",");
ArrayList&ShardRouting& ordered = new ArrayList&ShardRouting&(shards.size());
// fill it in a randomized fashion
for (int i = 0; i & shards.size(); i++) {
ShardRouting shardRouting = shards.get(i);
for(String nodeId:ids){
if (nodeId.equals(shardRouting.currentNodeId())) {
ordered.add(shardRouting);
return new PlainShardIterator(shardId, ordered);
}
重新编译源码就行了。查询时加上preference=_only_nodes:node1id,node2id 就可以指定在node1和node2中搜索
rockelixir
浏览: 207627 次
来自: 上海
(2)日志常量定义 /** 组件日志 */ private s ...
jjs456 写道你好,请问如何修改线程池配置vim conf ...
你好,请问如何修改线程池配置elasticsearch(15)
获取多个文档
通过查询API删除文档
通过查询API更新文档
所有的CRUD API都是单个索引的api。索引只接收一个索引名称,或者一个指向某个具体索引的索引别名。
下面的操作都可以通过kibana中的dev-tool来完成,如下图
PUT twitter/tweet/1
"user" : "kimchy",
"post_date" : "T14:12:12",
"message" : "trying out Elasticsearch"
响应结果:
"_shards" : {
"total" : 2,
"failed" : 0,
"successful" : 2
"_index" : "twitter",
"_type" : "tweet",
"_id" : "1",
"_version" : 1,
"created" : true,
"result" : created
动态创建索引
当我们在创建一个文档的时候,elasticsearch或默认帮我们创建索引和类型。索引类型的模式非常灵活,当我们新增一个字段的时候,会默认帮我们添加一个类型映射。(基本数据类型可以采用这个方法)
我们能够关闭索引的自动创建,我们只需要在配置文件(elasticsearch.yaml)中修改如下配置(集群中的所有配置必须保持一致):
action.auto_create_index : false
当然我们也能够关闭类型的自动创建,也只需要增加一个配置即可:
ndex.mapper.dynamic : false
其中,更为灵活的是,我们可以通过一个匹配模式来设定自定义的自动索引创建,比如:
action.auto_create_index :+aaa*,-bbb*,+ccc*,-(+表示允许,-表示不允许,表示前缀后缀匹配)
创建索引的java实现
因为版本的升级,maven引入依赖的jar包也发生了变化,我们需要引入下面两个pom:
&org.elasticsearch.client&
&transport&
&org.elasticsearch&
&elasticsearch&
创建client
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
我们对比发现,我们之前都是直接创建TransportClient的示例,但是这个类在5.2版本就变成一个抽象类。所以只能示例它的子类PreBuiltTransportClient。
如果我们想创建一个文档,elasticsearch给我们提供了四种方式来构建一个文档的途径:
手动拼接一个json字符串
使用map来添加内容,然后将map转换成json
使用第三方json工具包,如jackson将对应的bean转换成json
使用elasticsearch内置的XContentFactory来构建json
下面是四种方式的具体实现
public void setUp() throws UnknownHostException {
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
public void testUseJsonStr() {
String json = "{" +
"\"user\":\"kimchy\"," +
"\"postDate\":\"\"," +
"\"message\":\"trying out Elasticsearch\"" +
client.prepareIndex("twitter", "tweet", "1")
.setSource(json)
public void testUseMap(){
Map&String, Object& json = new HashMap&String, Object&();
json.put("user","kimchy");
json.put("postDate",new Date());
json.put("message","trying out Elasticsearch");
client.prepareIndex("twitter", "tweet", "2")
.setSource(json)
public void
testUseXContentFactory() throws IOException {
IndexResponse response = client.prepareIndex("twitter", "tweet", "3")
.setSource(
XContentFactory.jsonBuilder()
.startObject()
.field("user", "kimchy")
.field("postDate", new Date())
.field("message", "trying out Elasticsearch")
.endObject()
public void testUseJackson() throws JsonProcessingException {
Tweet tweet = new Tweet("kimchy",new Date(),"trying out Elasticsearch");
ObjectMapper mapper = new ObjectMapper();
byte[] json = mapper.writeValueAsBytes(tweet);
client.prepareIndex("twitter", "tweet", "4")
.setSource(json)
class Tweet{
private Date postD
public String getUser() {
public void setUser(String user) {
this.user =
public Date getPostDate() {
return postD
public void setPostDate(Date postDate) {
this.postDate = postD
public String getMessage() {
public void setMessage(String message) {
this.message =
public Tweet(String user, Date postDate, String message) {
this.user =
this.postDate = postD
this.message =
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:50620次
排名:千里之外
原创:17篇2675人阅读
Elasticsearch(6)
在刚接触一个东西时候我们想到的就是怎么简单使用,然后再看看它有哪些可以设置的东西。这里知道了Elasticsearch的基本增删改查后就来看看它的一些设置的使用。
Elasticsearch是一个使用Java构建的分布式的RESTful搜索和分析引擎,所以需要java运行环境,官方提示只支持Oracle的Java和OpenJDK并且所有Elasticsearch节点和客户端都应使用相同的JVM版本。至于Elasticsearch5.2至少需要Java8才能运行。
Elasticsearch配置文件是%ES_HOME%/config/elasticsearch.yml
也可以在命令行中指定在配置文件中指定的任何设置,使用-E如下语法:
我们在启动的时候可以通过参数指定集群和节点名称:
elasticsearch -Ecluster.name=my_cluster -Enode.name=node_1
注:包含空格的值必须用引号括起来。例如Epath.logs=”C:\My Logs\logs”
配置文件使用YAML标言
例如更改数据路径和日志目录
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
也可以按如下方式配置,不过这种写法很少用到:
data: /var/lib/elasticsearch
logs: /var/log/elasticsearch
使用配置文件中的${…}符号引用的环境变量将替换为环境变量的值,例如:
node.name:${HOSTNAME}
network.host:${ES_NETWORK_HOST}
Elasticsearch有些配置还是比较重要的,如下:
cluster.name
bootstrap.memory_lock
network.host
discovery.zen.ping.unicast.hosts
discovery.zen.minimum_master_nodes
elasticsearch在相同的环境中是根据cluster.name自动加入集群的,默认名称都是elasticsearch。确保不要在不同的环境中重复使用相同的集群名称,否则可能会导致加入错误集群的节点,所以cluster.name还是应该手动配置的。而node.name值得配置一个更有意义的名称,Elasticsearch将使用随机生成的uuid的前7个字符作为节点id。请注意,节点ID是持久化的,并且在节点重新启动时不会更改,因此默认节点名称也不会更改,当然也可以设置为服务器的主机名:node.name: ${HOSTNAME}
path.data设置可以被设置为多条路径,在这种情况下,所有的路径将被用于存储数据(虽然属于单个碎片文件将全部存储相同的数据路径上):
- /mnt/elasticsearch_1
- /mnt/elasticsearch_2
- /mnt/elasticsearch_3
bootstrap.memory_lock 默认为true,即没有任何JVM被交换到磁盘。内存与磁盘之间的交换越多肯定是越影响效率的。
network.host 默认情况下,Elasticsearch仅绑定到环回地址 - 例如127.0.0.1 和[::1]。这足以在服务器上运行单个开发节点。
事实上,可以在$ES_HOME单个节点上的同一位置启动多个节点。这可以用于测试Elasticsearch形成集群的能力,但它不推荐用于生产的配置。为了与其他服务器上的节点进行通信并形成集群,需要将节点绑定到非环回地址比如:network.host:192.168.1.10。一旦自定义设置network.host,Elasticsearch会假定正在从开发模式转移到生产模式,并将许多系统启动检查从警告升级到异常。
discovery.zen.ping.unicast.hosts 开箱即用,没有任何网络配置,Elasticsearch将绑定到可用的环回地址,并将扫描端口以尝试连接到在同一服务器上运行的其他节点。这提供了一个自动聚类体验,而无需执行任何配置。
当时刻到与其他服务器上的节点形成集群时,就必须提供集群中可能存在和可以联系的其他节点的种子列表。这可以指定如下:
discovery.zen.ping.unicast.hosts:
- 192.168.1.10:9300
- 192.168.1.11 #如果没有指定, 该端口将默认为transport.profiles.default.port并回退transport.tcp.port
#解析为多个IP地址的主机名将尝试所有解析的地址。
为了防止数据丢失,discovery.zen.minimum_master_nodes配置设置至关重要,以便每个主节点都知道形成集群最少需要的主节点数量。
没有这种设置,遇到网络故障的群集有可能将群集分成两个独立的群集,这将导致分裂使数据丢失。
为了避免脑裂,此设置应设置为主节点的法定数量:
(master_eligible_nodes / 2) + 1
换句话说,如果有三个主节点,则最小主节点应设置为(3 / 2) + 1或2:
discovery.zen.minimum_master_nodes: 2
其实这些配置在elasticsearch.yml中都有简单的说明
当然这些基础配置是不足以在实际生产中使用的,即使你不做任何配置也可以使用。
为了更好的使用我们还需要新增一些设置,之前也提到过,目前本机测试我就只新增配置了几项
#避免出现跨域问题
http.cors.enabled: true
http.cors.allow-origin: "*"
#在chorem中 当elasticsearch安装x-pack后还可以访问
http.cors.allow-headers: Authorization
#启用审核以跟踪与您的Elasticsearch群集进行的尝试和成功的交互
xpack.security.audit.enabled: true
能设置的肯定还很多,这里就先记录这些吧。以后慢慢深入。
注:现在我也是在官网看文档学习,所以这里的很多内容在基本上都是可以找到的。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:41873次
排名:千里之外
原创:17篇
阅读:18307
(2)(4)(7)(4)(1)

我要回帖

更多关于 elasticsearch 高可用 的文章

 

随机推荐