在es的使用过程中,全文搜索属于一个常见的场景,特别是当我们将es作为日志存储检索来使用时,根据关键字查询对应的日志信息,可以怎么处理呢?
1. 动态模板结合copy_to方式 在创建索引的时候,我们新增一个allColumnValue的字段,将所有其他的column值都拷贝过去,然后针对这个字段进行检索,即可以实现全文的搜索方式了
这里借助dynamic_templtes
来实现上面的自动拷贝逻辑,因此我们可以如下创建一个索引
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 PUT search_all_demo { "mappings" : { "dynamic_templates" : [ { "copy_to_allcolumnvalue" : { "match_mapping_type" : "*" , "mapping" : { "copy_to" : "allColumnValue" , "ignore_above" : 512 , "type" : "keyword" } } } ], "properties" : { "allColumnValue" : { "type" : "text" } } } }
创建上面的映射表时,两个点
allColumnValue:字段
dynamic_templates: 实现字段拷贝
接下来写入一个数据进行测试
1 2 3 4 5 6 7 POST search_all_demo/_doc { "name" : "一灰灰" , "site" : "www.hhui.top" , "title" : "java developer" }
然后检索一下是否可以查询到希望的结果
1 2 3 4 5 6 7 8 GET search_all_demo/_search { "query" : { "match" : { "allColumnValue" : "灰灰" } } }
上面这个查询之后,正常会命中我们的数据,并返回
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 { "took" : 1 , "timed_out" : false , "_shards" : { "total" : 1 , "successful" : 1 , "skipped" : 0 , "failed" : 0 }, "hits" : { "total" : { "value" : 1 , "relation" : "eq" }, "max_score" : 0.7911257 , "hits" : [ { "_index" : "search_all_demo" , "_type" : "_doc" , "_id" : "1FoBk3wB-kdeh8MF_IbL" , "_score" : 0.7911257 , "_source" : { "name" : "一灰灰" , "site" : "www.hhui.top" , "title" : "java developer" } } ] } }
注意
使用上面这种配置时,对于Field有要求,当我们制定一个Map类型时,会失败
1 2 3 4 5 6 7 8 9 POST search_all_demo/_doc { "name" : "一灰" , "site" : "blog.hhui.top" , "ddd" : { "user" : "yihui" , "pwd" : "yihui" } }
上面的ddd
会提示异常
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 { "error" : { "root_cause" : [ { "type" : "mapper_parsing_exception" , "reason" : "failed to parse field [ddd] of type [keyword] in document with id '11qek3wB-kdeh8MFm4bN'. Preview of field's value: '{pwd=yihui, user=yihui}'" } ], "type" : "mapper_parsing_exception" , "reason" : "failed to parse field [ddd] of type [keyword] in document with id '11qek3wB-kdeh8MFm4bN'. Preview of field's value: '{pwd=yihui, user=yihui}'" , "caused_by" : { "type" : "illegal_state_exception" , "reason" : "Can't get text on a START_OBJECT at 4:10" } }, "status" : 400 }
2. 部分字段组合搜索 上面介绍的是全量的数据凭借到allColumnValue,从而实现全文检索;可能在实际的场景中,我只是希望对部分的field进行联合检索,基于此可以如下设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 PUT search_union_demo { "mappings" : { "properties" : { "allColumnValue" : { "type" : "text" }, "name" : { "type" : "keyword" , "ignore_above" : 512 , "copy_to" : [ "allColumnValue" ] }, "site" : { "type" : "keyword" , "ignore_above" : 512 , "copy_to" : [ "allColumnValue" ] } } } }
新增两个数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 POST search_union_demo/_doc { "name" : "test" , "site" : "spring.hhui.top" , "ddd" : { "user" : "一灰" , "pwd" : "yihui" } } POST search_union_demo/_doc { "name" : "一灰" , "site" : "blog.hhui.top" , "ddd" : { "user" : "yihui" , "pwd" : "yihui" } }
然后我们检索一灰
时,可以查到第二条数据
1 2 3 4 5 6 7 8 GET search_union_demo/_search { "query" : { "match" : { "allColumnValue" : "一灰" } } }
输出结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 { "took" : 2 , "timed_out" : false , "_shards" : { "total" : 1 , "successful" : 1 , "skipped" : 0 , "failed" : 0 }, "hits" : { "total" : { "value" : 1 , "relation" : "eq" }, "max_score" : 1.2814486 , "hits" : [ { "_index" : "search_union_demo" , "_type" : "_doc" , "_id" : "2Fqjk3wB-kdeh8MFy4aC" , "_score" : 1.2814486 , "_source" : { "name" : "一灰" , "site" : "blog.hhui.top" , "ddd" : { "user" : "yihui" , "pwd" : "yihui" } } } ] } }
3. 小结 本文主要介绍借助copy_to,来实现es的联合/全文搜索的功能;通过简单的设置,来支撑更友好的查询场景
II. 其他 一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明 尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
3. 扫描关注 一灰灰blog