- 浏览: 399956 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (311)
- 网站开发及性能优化 (1)
- JQUERY滚动加载 (1)
- 网络编辑 (1)
- redis (2)
- memcache (4)
- mongodb (5)
- kafka (7)
- apache (3)
- Nexus (2)
- 操作系统 (21)
- JDK (2)
- MyEclipse (11)
- SVN (4)
- Tomcat (3)
- Solr (4)
- CENTOS (5)
- ubuntu (2)
- 新浪微博api (1)
- elasticsearch (60)
- java (28)
- MAC (6)
- Lucene (4)
- Linux (14)
- mysql (6)
- XenCenter (1)
- ext (3)
- spring (6)
- oracle (4)
- tsp (1)
- JForum (1)
- jms (1)
- CAS (1)
- jquery (6)
- freemarker (2)
- 项目管理 (5)
- CSS (3)
- 事务管理 (1)
- js (3)
- 分词 (1)
- 分词器 (1)
- oauthToken (1)
- hadoop (8)
- spark (1)
- cache (1)
- unicode (1)
- 正则表达式 (1)
- google (1)
- Postfix (4)
- windows (3)
- 搜索引擎 (1)
- notepad (1)
- nginx (1)
- outlook (1)
- Fiddler (2)
- Shadowsocks (0)
- github (1)
- 算法 (4)
- zabbix (1)
- office (2)
- maven (8)
- TeamView (1)
- csv (1)
- mikrotik (1)
- DELL (1)
- USVN (2)
- mybatis (3)
- vue (1)
- python (1)
- zxing (2)
- Intellij idea (0)
- IDEA (2)
- http (2)
- JWT (1)
- CAP (1)
- Nacos (1)
- OpenFeign (1)
- SpringCloud (1)
- feign (1)
- springboot (2)
- skywalking (1)
- 微服务 (2)
- 部署 (1)
- bootstrap (1)
最新评论
-
xam_sunny:
用楼主的第一种方法解决了乱码问题,谢谢分享。
spring 中文乱码 -
lzq570:
...
freemarker中分页
介绍下ElasticSearch里Parent-Child特性的使用。
//首先创建一系列新闻的索引,这里我们将hot类型作为parent-chid关系里面的parent。
curl -XPUT 'http://localhost:9200/news/hot/1' -d '{ "uname" : "medcl", "content" : "河南警方:“南阳老板遭逼供致残与狗同笼”纯属谎言"}'
curl -XPUT 'http://localhost:9200/news/hot/2' -d '{ "uname" : "medcl", "content" : "马英九打两岸牌反制绿营"}'
curl -XPUT 'http://localhost:9200/news/hot/3' -d '{ "uname" : "medcl", "content" : "专题:中共十七届六中全会公报"}'
//假设我们对每个新闻的评论也分别建立索引,那么新闻的评论和新闻之间会存在一个关系,一篇新闻肯定是存在多个评论,那么我们将评论comment存一个索引,并且和前面的hot新闻索引建立parent-chid关系,评论在这里为child。
//将索引类型hot与comment之间建立parent-child的mapping关系
curl -XPUT 'http://localhost:9200/news/comment/_mapping' -d '{ "comment" : { "_parent" : { "type" : "hot" } }}'
//直接试试创建一个comment评论看看,发现已经不行了,原来指定了类型拥有parent-child关系之后,必须要带上parent参数
curl -XPUT 'http://localhost:9200/news/comment/1' -d '
{ "uname" : "凤凰网安徽省六安市网友", "content" : "河南警方的话没人信"}'
{"error":"RoutingMissingException[routing is required for [news]/[comment]/[1]]"
,"status":500}
正确的方式创建几条评论,并且和前面的第一条新闻建立关系,如下:
curl -XPUT 'http://localhost:9200/news/comment/1?parent=1' -d '{ "uname" : "凤凰网安徽省六安市网友", "content" : "河南警方的话没人信"}'
curl -XPUT 'http://localhost:9200/news/comment/2?parent=1' -d '{ "uname" : "凤凰网湖北省武汉市网友", "content" : "没有监督权\n没有调查\n一切当然只能是谣言"}'
curl -XPUT 'http://localhost:9200/news/comment/3?parent=1' -d '{ "uname" : "ladygaga", "content" : "双下肢不活动,存在废用性肌肉萎缩。请问,这个是怎么做到的?"}'
curl -XPUT 'http://localhost:9200/news/comment/4?parent=1' -d '{ "uname" : "medcl", "content" : "额"}'
我们使用has_child查询一下:
curl -XGET 'http://localhost:9200/news/_search' -d '{
"query" : {
"has_child" : {
"type" : "comment",
"query" :{"term" : {"uname" : "medcl"} }
}
}
}'
结果如下:
{
"took": 10,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "news",
"_type": "hot",
"_id": "1",
"_score": 1,
"_source": {
"uname": "medcl",
"content": "河南警方:“南阳老板遭逼供致残与狗同笼”纯属谎言"
}
}
]
}
}
注意,如果是中文可能需要调整analyzer,默认查询不出来
curl -XGET 'http://localhost:9200/news/_search' -d '{
"query" : {
"has_child" : {
"type" : "comment",
"query" :{"term" : {"uname" : "凤凰网湖北省武汉市网友"} }
}
}
}'
结果:
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
原因分析:
hot类型没有指定使用的分析器,所以中文默认的standard analyzer拆成了一个个的字,但是has_child模式里面的DSL的term query为区配查询,所以查询不出来
curl -XGET 'http://localhost:9200/news/_search' -d '{
"query" : {
"has_child" : {
"type" : "comment",
"query" :{"term" : {"uname" : "凤"} }
}
}
}'
试一下,果然如此,所以mapping的配置还是很重要的。
那怎样解决呢?两种方案
1.给hot类型mapping设置analyzer为not_analyzer(在这里不适用)
2.设置查询时使用的分析器,那就不能使用term query了,term query不支持分析器,我们这里使用可以text query
curl -XGET 'http://localhost:9200/news/_search' -d '{
"query" : {
"has_child" : {
"type" : "comment",
"query" :{"text" : {"uname" : "凤凰网"} }
}
}
}'
当然中文分词用standard analyzer肯定是不行的,你可以灵活替换成其他的中文分析器。
关于text query的其他参数,可以看这里:http://www. elasticsearch .org/guide/reference/query-dsl/text-query.html
ok,我们再试试top_children查询(http://www.elasticsearch.org/guide/reference/query-dsl/top-children-query.html)
topchildren在child进行查询的时候,会预估一个hit size,然后对这个hit size大小的hit结果与parent做查询结果合并聚集,如果合并之后的结果文档数小于查询条件中的from/size参数设置,es则会进行更深度的搜索,这样做的好处是显而易见的,它不会对所有的child索引文档进行处理,可以节省一些额外的开销,但是注意由此造成的total_hits值的不准确。
调用如下:
curl -XGET 'http://localhost:9200/news/_search' -d '{
"query": {
"top_children": {
"type": "comment",
"query": {
"text": {
"uname": "凤凰网"
}
},
"score": "max",
"factor": 5,
"incremental_factor": 2
}
}
}'
结果:
{
"took": 30,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.60276437,
"hits": [
{
"_index": "news",
"_type": "hot",
"_id": "1",
"_score": 0.60276437,
"_source": {
"uname": "medcl",
"content": "河南警方:“南阳老板遭逼供致残与狗同笼”纯属谎言"
}
}
]
}
}
有了parent-chid这个特性,我们可以做很多事情,比如,如果要给索引数据加上权限,一般来说索引内容本身更新不是很频繁,但是权限信息更新很频繁,我们也可以采用parent-child这种方式来做,如下:
//建立权限子索引
curl -XPUT 'http://localhost:9200/news/role/_mapping' -d '{ "role" : { "_parent" : { "type" : "hot" } }}'
//创建每个新闻的用户权限索引记录
curl -XPUT 'http://localhost:9200/news/role/1?parent=1' -d '{ "uid" : "1001"}'
curl -XPUT 'http://localhost:9200/news/role/2?parent=2' -d '{ "uid" : "1001"}'
curl -XPUT 'http://localhost:9200/news/role/3?parent=3' -d '{ "uid" : "1003"}'
//执行查询,返回uid为1001可以查看的新闻集合
curl -XGET 'http://localhost:9200/news/_search' -d '{
"query": {
"top_children": {
"type": "role",
"query": {
"text": {
"uid": "1001"
}
},
"score": "max",
"factor": 5,
"incremental_factor": 2
}
}
}'
结果:
{
"took": 10,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 2.098612,
"hits": [
{
"_index": "news",
"_type": "role",
"_id": "1",
"_score": 2.098612,
"_source": {
"uid": "1001"
}
},
{
"_index": "news",
"_type": "role",
"_id": "2",
"_score": 1,
"_source": {
"uid": "1001"
}
}
]
}
}
//上面通过用户可以直接对parent索引进行数据的过滤,但是往往我们还需要对parent的其他条件进行查询,怎么做呢?
首先ES支持filtered query,对应lucene的filteredquery,主要就是说先查询,得到一个结果集,然后对这个结果集执行filtered查询再过滤一把,es说明在这里(http://www.elasticsearch.org/guide/reference/query-dsl/filtered-query.html)
下面是一些查询的例子,方便参考:
curl -XGET 'http://localhost:9200/news/_search' -d '{
"query": {
"filtered": {
"query": {
"term": {
"content": "河"
}
},
"filter": {
"or": [
{
"has_child": {
"type": "role",
"query": {
"term": {
"uid": "1001"
}
}
}
},
{
"has_child": {
"type": "comment",
"query": {
"term": {
"uname": "ladygaga"
}
}
}
}
]
}
}
}
}'
curl -XGET 'http://localhost:9200/news/_search' -d '{
"query":
{
"filtered" : {
"query" : {
"top_children": {
"type": "role",
"query": {
"term": {
"uid": "1001"
}
},
"score": "max",
"factor": 5,
"incremental_factor": 2
}
},
"filter" : {
"fquery" : {
"query" : {
"query_string" : {
"query" : "content:马"
}
},
"_cache" : true
}
}
}}}'
curl -XGET 'http://localhost:9200/news/_search' -d '{
"query":
{
"filtered" : {
"query" : {
"query_string" : {
"query" : "uname:medcl"
}
},
"filter" : {
"has_child": {
"type": "role",
"query": {
"term": {
"uid": "1001"
}
},
"score": "max",
"factor": 5,
"incremental_factor": 2
}
}
}}}'
curl -XGET 'http://localhost:9200/news/_search' -d '{
"query": {
"bool": {
"must": [
{
"top_children": {
"type": "role",
"query": {
"term": {
"uid": 1001
}
}
}
},
{
"text": {
"uname": "medcl"
}
}
]
}
}
}'
curl -XGET 'http://localhost:9200/news/_search' -d '{
"query": {
"bool": {
"must": [
{
"top_children": {
"type": "role",
"query": {
"term": {
"uid": 1001
}
}
}
},
{
"text": {
"content": "马英九"
}
}
]
}
}
}'
需要注意的是,parent-chid这种特性虽好,但是也要用对地方,服务端会将所有的_id加载到内存中进行关联和过滤,所以必须保证内存足够大才行。
发表评论
-
elasticsearch-env行116未预期的符号附近有语法错误
2020-07-04 15:11 746> 第一次解决方式(): bash 3.0后,she ... -
Elasticsearch启动、停止脚本
2020-07-04 15:00 711构建Elasticsearch启动脚本 start_es ... -
Elasticsearch搜索类型(query type)详
2016-08-04 12:05 673es在查询时,可以指定 ... -
elasticsearch游标查询所有数据
2016-08-04 10:47 2070在Elasticsearch中找一个 ... -
Elasticsearch安装与测试验证详解
2016-07-29 18:05 829什么是Elasticsearch? 【百科】Elasti ... -
Shard数调优(ElasticSearch性能)
2016-07-27 18:12 1979摘要 当创建一个索引的时候,我们经常会面对一个问题:要为索 ... -
Elasticsearch的存储模型和读写操作
2016-07-27 15:46 483剖析Elasticsearch集群系列涵盖了当今最流行的分布 ... -
亿级规模的 Elasticsearch 优化实战
2016-07-27 15:33 899Elasticsearch 的基本信息大致如图所示,这里就不 ... -
Elasticsearch 架构以及源码概览
2016-07-22 18:18 722Elasticsearch 是最近两年异军突起的一个兼有搜 ... -
Elasticsearch模块功能之-路由(routing)
2016-07-22 15:44 723索引分片分配能够控制索引分片在节点上怎么分布,那对于具体的文 ... -
elasticsearch通用API,多数据源,分组
2016-07-12 13:53 2926公司项目大规模使用elasticsearch,封装了统一的e ... -
Elasticsearch过滤与聚合的先后顺序java实现
2016-07-07 10:48 4467一、Elasticsearch的聚合 ES的聚合相当于关系 ... -
ElasticSearch Java api 详解_V1.0
2016-07-07 10:23 824原英文文档:http://www.elasticsearc ... -
Elasticsearch head插件介绍
2016-06-30 16:31 1936datasize: 121Mi (242Mi)docs: 1 ... -
Elasticsearch 1.7 热更新
2016-06-07 14:42 1318搜索是一个需要不停改进的项目,有时我们需要更新分词插件,有时 ... -
Elasticsearch 搜索服务器全集群升级版本并重启
2016-05-28 21:36 754Elasticsearch 搜索服务器需要一个完整的集群重启 ... -
集群临时重启
2016-05-28 21:17 617集群节点临时重启当修改配置时可能需要重启集群才生效,或者集群发 ... -
elasticsearch之节点重启
2016-05-24 13:22 990Elasticsearch节点重启时背后发 ... -
elasticsearch如何安全重启节点
2016-05-24 11:58 909elasticsearch集群,有时候可能需要修改配置 ... -
Elasticsearch 合理内存分配
2016-05-03 22:45 785Elasticsearch默认安装后设置的内存是1GB,对于 ...
相关推荐
在这个特定的场景中,我们关注的是一个自定义的"elasticsearch join 插件",这个插件是基于Elasticsearch的parent-child关系进行改进的,新增了字段join功能。 在Elasticsearch原生的parent-child关系中,数据被...
Boost the searching capabilities of your system through synonyms, multilingual data handling, nested objects and parent-child documents Deep dive into the world of data aggregation and data analysis ...
分布式搜索是现代大数据处理的关键技术之一,而Elasticsearch作为其中的佼佼者,因其高效、灵活和可扩展性而广泛应用于各种场景。本篇将深入探讨Elasticsearch的基础知识,涵盖其核心概念、环境搭建、配置管理以及...
09-6 -nested_vs_parent_child.avi 09-7 -reindex.avi 09-8 其他建议.avi 10-1 生产环境部署建议.avi 10-2 写性能优化.avi 10-3 读性能优化.avi 10-4 如何设定shard数.avi 10-5 xpack监控功能介绍.avi 11-1 入门及...
Elasticsearch Grails 插件 - 示例应用Elasticsearch Grails 插件的示例应用程序。 插件主页由 Noam Y. Tenne 维护并托管在 。为什么? 如果您习惯了 grails 但从未使用过 ,那么安装插件后您可能会有点迷茫。 ...
- **parent-child文档关系处理**:讲解如何在Elasticsearch中建立和查询parent-child文档关系,适用于某些特定的数据模型。 - **脚本使用**:介绍如何使用脚本来执行复杂的逻辑操作,如动态计算字段值等。 #### 第...
ElasticSearch是一款基于Lucene构建的开源搜索引擎,它提供了分布式的全文搜索功能,常用于大数据量的实时搜索场景。ElasticSearch 5.6版的Java API中文文档是针对Java开发者使用ElasticSearch的指导手册,它不仅...
GET /parent-index/_left{ "query": { "match": { "productName": "상품 조회" } }, "from": 0, "size": 10000, "join": { "index": "child-index", "parent": "bundleKey", "child": "bundleKey", "query": { "mat...
jQuery1.2 API 中文版折叠展开折叠全部展开全部 英文说明 核心jQuery 核心函数 jQuery(expression,[context]) jQuery(expression,[context]) 这个函数接收一个包含 CSS 选择器的字符串,然后用这个字符串去匹配一组...
- 有些名词复数形式有特殊变化,例如:child--children,mouse--mice,man--men,woman--women。 通过以上知识点的学习,学生应该能够更熟练地谈论自己的家庭,构建和理解 Family Tree,并掌握如何在句子中正确...
The author has charged in a previous article that child psychotherapy is es- sentially an expensive illusion with regard to the great majority of children referred to private therapists and to ...
- 特殊的不规则变化,如child->children,man->men,woman->women 通过这些知识点的学习,学生能够更熟练地表达和讨论家庭成员,增强语言表达的丰富性和准确性,同时也能增进对中西方家庭文化差异的理解。
parent -> parents;mother -> mothers;father -> fathers;sister -> sisters;brother -> brothers;son -> sons;daughter -> daughters;case -> cases;box -> boxes;card -> cards;family -> families。 ...
1. 名词复数形式:名词变复数有固定规则,如一般情况下加-s(parent -> parents),以s、x、ch、sh结尾的加-es(bus -> buses),以元音+y结尾的变y为i再加-es(child -> children),不规则名词变化(life -> lives...
console.log('Log from parent constructor'); }, { foo: function() { return 42; } }); var ChildClass = CG(function() { console.log('Log from child constructor'); }, { getMeaning: function() { ...
- 规则变化:一般情况下,名词在词尾加 `-s` 或 `-es` 形成复数,例如 `book -> books`。 - 不规则变化:某些名词有特殊的复数形式,如 `man -> men`, `child -> children`。 - 复合名词变复数:如果名词由两个词...
div.parent div.child { /* 选择父div下的子div */ } /* 使用逻辑运算符 or */ .button.primary, .button.secondary { /* 选择类为primary或secondary的按钮 */ } ``` 通过学习和分析这个项目的源代码,你可以...
在这个例子中,`Child`类通过`Parent.call(this, name)`继承了`Parent`类的属性,同时`Child.prototype`指向了`Parent.prototype`的一个新副本,从而继承了`Parent`类的方法。这种方式既保留了父类的实例属性,又...
Child.prototype = Object.create(Parent.prototype); Child.prototype.constructor = Child; var child = new Child(); console.log(child.name); // 输出 "parent" ``` 2. **构造函数继承**:通过在子类...