问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用正确的姿势进行搜索

发布网友 发布时间:2022-04-26 16:09

我来回答

1个回答

热心网友 时间:2023-10-13 16:02

安装
如果你有 linux,并且恰好也有 docker, 那么请运行如下命令:
sudo docker run -d -p 9200:9200 -p 9300:9300 elasticsearch

你要是看到一串 id, 恭喜你, 你已经有了自己的搜索了!就是这么简单!
我们来验证一下搜索服务:
ubuntu:~$ curl localhost:9200
{
"status" : 200,
"name" : "Adonis",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "1.7.1",
"build_hash" : "b88f43fc40b0bcd7f173a1f9ee2e97816de80b19",
"build_timestamp" : "2015-07-29T09:54:16Z",
"build_snapshot" : false,
"lucene_version" : "4.10.4"
},
"tagline" : "You Know, for Search"
}

返回值 200!你成功了!这个结果除了告诉你 Elastic Search 已经启动好之外,还显示了版本号,build 信息,lucene 版本等信息。
如果你不用 Linux 或者 Docker,放心,情况也不复杂。首先你需要 Java,然后去官网下载,解压,运行既可。
使用
Elastic Search 的初级功能十分易用。Restful 请求就可以完成一切操作。所以接下来的体验,你只需要一个命令行即可,但是为了直观方便,你也可以选择官方推荐的 Marvel 或者 Postman。
相信很多人都是吃货,下面,我用中国第九大菜系食堂菜作为搜索的原数据演示 Elastic Search 的用法。
插入数据
首先来一道勉强正常的菜,苹果炖牛肉。
ubuntu:~$ curl -XPOST localhost:9200/food/canteen?pretty -d '{title: "苹果炖牛肉", source: "sjtu"}'
{
"_index" : "food",
"_type" : "canteen",
"_id" : "AU8HEQxfW68mQc8rk4AS",
"_version" : 1,
"created" : true
}

有点迷糊?那来稍微介绍一点背景知识,看看上面的命令都做了啥。
Elastic Search 使用 document 方式存储, 类似 MongoDB。它不仅高效而且分布式扩展性极佳,基于赫赫有名的 Lucene 搭建,在搜索界的地位就如同杰伦小公举在歌坛的地位一般。很多人可能有关系型数据库开发的经验,下面来张 Elastic Search 和 MySQL 的术语类比图,帮助理解。

MySQL
Elastic Search

Database Index
Table Type
Row Document
Column Field
Schema Mappping
Index Everything Indexed by default
SQL Query DSL
上面例子中,localhost:9200是服务地址,Elastic Search 默认利用 9200 作为 Rest 服务的端口,9300 作为内部通信接口和 Java 客户端接口。food是 index,canteen是 type,里面的数据形成document。值得注意的是,跟其他 NoSQL 数据库一样,Schema 不需要预先定义,直接插入数据即可,Elastic Search会智能地分析每个 Field 的值并自动建立索引。每个 document 都有一个 id,如果不指定则会自动生成。可以看到插入成功之后,生成了"_id" : "AU8HEQxfW68mQc8rk4AS"。插入命令使用 Post 请求,方便使用和测试。
另外,在上面的例子中,我加入了?pretty主要是让结果的 json 显示更好看。
获取数据
虽然数据已经存好了,但是没有直接取到,总是心有不安,下面这条命令即可以查看数据:
ubuntu:~$ curl -XGET localhost:9200/food/canteen/AU8HEQxfW68mQc8rk4AS?pretty
{
"_index" : "food",
"_type" : "canteen",
"_id" : "AU8HEQxfW68mQc8rk4AS",
"_version" : 1,
"found" : true,
"_source":{title: "苹果炖牛肉", source: "sjtu"}
}

可以看到,请求改为了GET,请求形式为/index/type/id。
更新数据
再来一道菜,番茄炒菠萝,用到我们刚才说的POST请求。
ubuntu:~$ curl -XPOST localhost:9200/food/canteen?pretty -d '{title: "番茄炒菠萝", source: "sjtu"}'
{
"_index" : "food",
"_type" : "canteen",
"_id" : "AU8HQW0-W68mQc8rk4Ab",
"_version" : 1,
"created" : true
}

等等,这道菜是武汉大学的,看来我们得更新一下source。也许聪明的你已经猜到,发个PUT请求就可以搞定了。
ubuntu:~$ curl -XPUT localhost:9200/food/canteen/AU8HQW0-W68mQc8rk4Ab?pretty -d '{title: "番茄炒菠萝", source: "whu"}'
{
"_index" : "food",
"_type" : "canteen",
"_id" : "AU8HQW0-W68mQc8rk4Ab",
"_version" : 2,
"created" : false
}

可以看到_version变成了2,表示更新过了。再GET一下确认结果。
ubuntu:~$ curl -XGET localhost:9200/food/canteen/AU8HQW0-W68mQc8rk4Ab?pretty
{
"_index" : "food",
"_type" : "canteen",
"_id" : "AU8HQW0-W68mQc8rk4Ab",
"_version" : 2,
"found" : true,
"_source":{title: "番茄炒菠萝", source: "whu"}
}

可以看到,_source,也就是插入的原始数据,确实改变了。
删除数据
继续来一道菜,月饼炒辣椒!
ubuntu:~$ curl -XPOST localhost:9200/food/canteen?pretty -d '{title: "月饼炒辣椒", source: "fjnu"}'
{
"_index" : "food",
"_type" : "canteen",
"_id" : "AU8HRPoOW68mQc8rk4Ac",
"_version" : 1,
"created" : true
}

算了,好像太丧心病狂了,对吃货的幼小心灵产生了暴击,我们还是把它删掉吧。
ubuntu:~$ curl -XDELETE localhost:9200/food/canteen/AU8HRPoOW68mQc8rk4Ac?pretty
{
"found" : true,
"_index" : "food",
"_type" : "canteen",
"_id" : "AU8HRPoOW68mQc8rk4Ac",
"_version" : 2
}

GET验证一下是否真的被删除了。
ubuntu:~$ curl -XGET localhost:9200/food/canteen/AU8HRPoOW68mQc8rk4Ac?pretty
{
"_index" : "food",
"_type" : "canteen",
"_id" : "AU8HRPoOW68mQc8rk4Ac",
"found" : false
}

显示"found" : false,可见删除确实成功了。
搜索数据
Elastic Search 支持相当复杂的搜索情形。像“有水果有肉有主食红黄白相间成粒状”这种可以把 MySQL 的检索虐得死去活来的查询,Elastic Search 可以轻松告诉你这应该是名菜“哈密瓜年糕牛肉粒”。下面看看最简单却很实用的搜索:查询所有值。
ubuntu:~$ curl -XGET localhost:9200/food/canteen/_search?pretty
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 1.0,
"hits" : [ {
"_index" : "food",
"_type" : "canteen",
"_id" : "AU8HEQxfW68mQc8rk4AS",
"_score" : 1.0,
"_source":{title: "苹果炖牛肉", source: "sjtu"}
}, {
"_index" : "food",
"_type" : "canteen",
"_id" : "AU8HQW0-W68mQc8rk4Ab",
"_score" : 1.0,
"_source":{title: "番茄炒菠萝", source: "whu"}
} ]
}
}

可以看到,形如GET _search即可。结果会显示所有给定 index 和 type 下的 document。hits下面包含找到的具体内容。_score表示相关程度,分数越高表示越相关,搜索引擎对于结果的排序都是通过类似的机制完成。
再来一个简单地查询,查找source是sjtu的菜。
ubuntu:~$ curl -XGET localhost:9200/food/canteen/_search?pretty -d '{"query":{"match":{"source":"sjtu"}}}'
{
"took" : 35,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.30685282,
"hits" : [ {
"_index" : "food",
"_type" : "canteen",
"_id" : "AU8HEQxfW68mQc8rk4AS",
"_score" : 0.30685282,
"_source":{title: "苹果炖牛肉", source: "sjtu"}
} ]
}
}

这里用到了match query来搜索,可以看到_score的变化。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果手机微信怎么换漂亮字体(苹果手机微信怎么换行输入) 有什么好用的app转换字体 手写转文字的软件 erp可以看评论地址吗 淘宝评论url是什么意思? 揭秘:码牌支付风控升级,背后真相揭秘 电脑电视直播软件哪个好用什么软件好电脑看电视直播 潼南子同街学区是哪些 三极管BU406价格和参数? 火锅料放在冰柜忘了插电一个星期给会坏了吗 火锅的设备有哪些 ubuntu9.04相对ubuntu8.04做了哪些变化 composer装laravel-scout-elastic装不上,报这样错误 柠檬蜂蜜水保质期多久 我想问问蜂蜜泡柠檬的保质期是多少天 我晚上开了一宿加湿器,早上起来发现电视屏幕和周围和手机屏上都有一层灰白色粉尘状的东西!请问是什么? 请教大神!使用美的加湿器后电视机屏幕上出现白色粉末,是什么情况? 小型加湿器放在电脑边上会不屏幕受潮 我一使用加湿器电脑屏幕边框钢琴烤漆的位置就有一层白 格力加湿器SC-30X60是否有LED显示屏? 格力加湿器通电后不喷雾,显示屏一直在闪 和密码都忘了,怎么才能找回之前的微信? SCK-50X60b?这款格力加湿器屏幕会变暗吗? 巴慕达加湿器屏幕出现锁 阿尔卡司净化无雾加湿器屏幕显示的准确吗? 触摸屏加湿器怎么改成插电启动 IAM加湿器屏幕显示的湿度准吗? 怎么设置关机还原C盘 电脑很多人用,想设置为关机系统自动还原, 如果电脑关机了现在如何恢复电脑的启动系统? 请问如何让自己的电脑像网吧的一样关机后还原系统 docker安装elasticsearh和mysql是否有交互 elastic-job容易部署吗 elastic certified engineer 在线可查吗 怎么判断elasticsearch安装成功没 java 访问elastic 需要使用ansj的jar包吗 为什么elasticjob中多了好多没有的任务 如何访问虚拟机中的elasticsearch python 查询elastic search有多少个索引 win10上Elasticsearch已经安装完成,设置elasticsearch-service.bat自启的时候出现这个问题,怎么解决呢? 怎么用苹果手机打开拨号然后进入 苹果手机怎么拨号上网 苹果手机拔号如何设置 苹果笔记本电脑死机以后怎么关机? 苹果手机如何用拨号打开游戏软件 什么软件不用验证码不用充钱定位? 苹果手机在拨号时怎么输入+号? 手机定位如何不需要验证码? 飞麒麟定位没有验证码能定位吗 怎样不需要验证码定位小米 怎样不用验证码又能用微信支付的定位服务