您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
elasticSearch基本自由文本搜索
发布时间:2021-08-17 20:48:04编辑:雪饮阅读()
查询DSL具有一长列不同类型的查询可以使用。 对于“普通”自由文本搜索,最有可能想使用一个名称为“查询字符串查询”。
查询字符串查询是一个高级查询,有很多不同的选项,ElasticSearch将解析和转换为更简单的查询树。如果忽略了所有的可选参数,并且只需要给它一个字符串用于搜索,它可以很容易使用。
现在尝试在众多电影的标题中搜索有“kill”这个词的电影信息:
C:\Users\Administrator>curl -XPOST "http://localhost:9200/_search" -H "Content-Type: application/json" -d "{\"query\":{\"query_string\":{\"query\":\"kill\"}}}"
{"took":1,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":3,"relation":"eq"},"max_score":0.9677497,"hits":[{"_index":"movies","_type":"movie","_id":"3","_score":0.9677497,"_source":{"title":"To Kill a Mockingbird","director":"Robert Mulligan","year":1962,"genres":["Crime","Drama","Mystery"]}},{"_index":"movies","_type":"movie","_id":"5","_score":0.9677497,"_source":{"title":"Kill Bill: Vol. 1","director":"Quentin Tarantino","year":2003,"genres":["Action","Crime","Thriller"]}},{"_index":"movies","_type":"movie","_id":"8","_score":0.8808694,"_source":{"title":"To Kill 2 a Mockingbird","director":"Robert Mulligan","year":1962,"genres":["Crime","Drama","Mystery"]}}]}}
执行上面的请求并查看结果,可以借用postman查看更直观的结果
正如预期的,得到了一些命中结果,每个电影的标题中都带有“kill”单词。
这里需要谨慎的就是“单词”,比如如下两条命令所创建的索引
curl -XPUT "http://localhost:9200/movies/movie/7" -H "Content-Type: application/json" -d "{\"title\":\"To Kill2 a Mockingbird\",\"director\":\"Robert Mulligan\",\"year\":1962,\"genres\":[\"Crime\",\"Drama\",\"Mystery\"]}"
curl -XPUT "http://localhost:9200/movies/movie/8" -H "Content-Type: application/json" -d "{\"title\":\"To Kill 2 a Mockingbird\",\"director\":\"Robert Mulligan\",\"year\":1962,\"genres\":[\"Crime\",\"Drama\",\"Mystery\"]}"
其中第一个创建的索引的电影信息中的标题中包含的是Kill2而不是Kill,它这个模糊搜索和mysql的模糊搜索是有区别的,是按所谓的单词(单词之间有空格)来匹配搜索的。
所以搜索结果里面并没有包含标题中包含有Kill2的电影信息。
所以这里我大胆猜想下elasticSearch比mysql性能快的原因,应该就是这个所谓的单词的概念了。
另外一个题外话
对于上篇文章中经过实验发现sense中用post形式结合_search,然后使用query关键字,会发现不会报错,但是put去创建或者更新一个索引信息时候就会报错,当时认为是_search或者post与put之间的实现在sense中的相关影响导致。
那么这里我们再以post形式结合_search并也用query关键字,只是这里我们像是上面一样使用基本自由文本搜索,搜索这个kill,你会发现搜索的结果匹配出来是8个
在我这里我现在目前电影索引信息总量就是8个,那么也就是说之前认为的post可以结合head然后添加body进行搜索
实际上这样做,从目前这个情况来看,应该还是body被干掉了,所以搜索的还就是默认的全部的电影索引信息。
另外再来一个题外话,就上面不用sense搜索时候,就用postman或者原生的curl搜索时候,会发现我们搜索的是kill,实际上Kill也匹配到了,那么目测这里默认应该是不区分大小写的。
但是查看一些资料说elasticSearch默认搜索是区分大小写的,那么我这个不区分大小写,那么综合起来就是说到底默认是否区分大小写进行搜索,这个应该是与版本有关的。我这个是elasticsearch-7.14.0-windows-x86_64,应该是目前window的x86_64的最新版。好像是前两天才下载的,好像也是下载官网最新版的。不过这种细节一般情况下影响不大就是了。
关键字词:elasticSearch,基本自由文本搜索