Elasticsearch系列---几个高级功能 (2)

删除索引,重新插入数据,查看mapping信息如下:

{ "test_index": { "mappings": { "type": { "dynamic_templates": [ { "integers": { "match_mapping_type": "long", "mapping": { "type": "integer" } } }, { "strings": { "match_mapping_type": "string", "mapping": { "fields": { "raw": { "ignore_above": 128, "type": "keyword" } }, "type": "text" } } } ], "properties": { "test_number": { "type": "integer" }, "test_string": { "type": "text", "fields": { "raw": { "type": "keyword", "ignore_above": 128 } } } } } } } }

以按预计类型进行映射,符合预期。

按field名称进行映射

"long_"开头的field,并且原本是long类型的,转换为integer类型

"string_"开头的field,并且原本是string类型的,转换为string.raw类型
"_text"结尾的field,并且原本是string类型的,保持不变

PUT /test_index { "mappings": { "type": { "dynamic_templates":[ { "long_as_integer": { "match_mapping_type":"long", "match": "long_*", "mapping":{ "type":"integer" } } }, { "string_as_raw": { "match_mapping_type":"string", "match": "string_*", "unmatch":"*_text", "mapping": { "type":"text", "fields": { "raw": { "type": "keyword", "ignore_above": 128 } } } } } ] } } }

插入数据:

PUT /test_index/type/1 { "string_test":"hello kitty", "long_test": 10, "title_text":"Hello everyone" }

查询mapping信息

{ "test_index": { "mappings": { "type": { "dynamic_templates": [ { "long_as_integer": { "match": "long_*", "match_mapping_type": "long", "mapping": { "type": "integer" } } }, { "string_as_raw": { "match": "string_*", "unmatch": "*_text", "match_mapping_type": "string", "mapping": { "fields": { "raw": { "ignore_above": 128, "type": "keyword" } }, "type": "text" } } } ], "properties": { "long_test": { "type": "integer" }, "string_test": { "type": "text", "fields": { "raw": { "type": "keyword", "ignore_above": 128 } } }, "title_text": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } } }

结果符合预期。

在某些日志管理的场景中,我们可以定义好type,每天按日期创建一个索引,这种索引的创建就可以用到映射模板,把我们定义的映射关系全部做进去。

高亮搜索

我们在浏览器上搜索文本时,发现我们输入的关键字有高亮显示,查看html源码就知道,高亮的部分是加了<em>标签的,ES也支持高亮搜索这种操作的,并且在返回的文档中自动加了<em>标签,兼容html5页面。

highlight基本语法

我们还是以音乐网站为案例,开始进行高亮搜索:

GET /music/children/_search { "query": { "match": { "content": "love" } }, "highlight": { "fields": { "content": {} } } }

highlight里面的参数即为高亮搜索的语法,指定高亮的字段为content,我们可以看到命中的Love里面带了<em>高亮标签,<em></em>表现在html上会变成红色,所以说你的指定的field中,如果包含了那个搜索词的话,就会在那个field的文本中,对搜索词进行红色的高亮显示。

{ "took": 35, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 1, "max_score": 0.2876821, "hits": [ { "_index": "music", "_type": "children", "_id": "5", "_score": 0.2876821, "_source": { "id": "1740e61c-63da-474f-9058-c2ab3c4f0b0a", "author_first_name": "Jean", "author_last_name": "Ritchie", "author": "Jean Ritchie", "name": "love somebody", "content": "love somebody, yes I do", "language": "english", "tags": "love", "length": 38, "likes": 3, "isRelease": true, "releaseDate": "2019-12-22" }, "highlight": { "content": [ "<em>love</em> somebody, yes I do" ] } } ] } }

highlight下的字段可以指定多个,这样就可以在多个字段命中的关键词进行高亮显示,例如:

GET /music/children/_search { "query": { "match": { "content": "love" } }, "highlight": { "fields": { "name":{}, "content": {} } } } 三种高亮语法

有三种高亮的语法:

plain highlight:使用standard Lucene highlighter,对简单的查询支持度非常好。

unified highlight:默认的高亮语法,使用Lucene Unified Highlighter,将文本切分成句子,并对句子使用BM25计算词条的score,支持精准查询和模糊查询。

fast vector highlighter:使用Lucene Fast Vector highlighter,功能很强大,如果在mapping中对field开启了term_vector,并设置了with_positions_offsets,就会使用该highlighter,对内容特别长的文本(大于1MB)有性能上的优势。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsppjf.html