当前位置: 首页 > news >正文

淘客客怎么做自己的网站wordpress随机注册

淘客客怎么做自己的网站,wordpress随机注册,多少钱可以报警立案,宁波外贸公司招聘目录 ElasticSearch 正向索引与倒排索引 数据库与elasticsearch概念对比 安装ES、Kibana与分词器 分词器作用 自定义字典 拓展词库 禁用词库 索引库操作 Mapping属性 创建索引库 查询索引库 删除索引库 修改索引库 文档操作 新增文档 查找文档 修改文档 全量…目录 ElasticSearch 正向索引与倒排索引 数据库与elasticsearch概念对比 安装ES、Kibana与分词器 分词器作用 自定义字典 拓展词库 禁用词库 索引库操作 Mapping属性 创建索引库 查询索引库 删除索引库 修改索引库 文档操作 新增文档 查找文档 修改文档 全量修改 增量修改 删除文档 RestClient操作索引库 RestClient操作文档 新增文档 根据Id查询文档数据 更新文档 删除文档 批量新增 DSL查询语法 查询所有 全文检索 精确查询 地理查询 复合查询 搜索结果处理 排序 分页 高亮 RestClient查询文档 查询全部 查询文档 解析数据 全文检索查询 精确查询 复合查询 排序和分页 高亮 ElasticSearch q什么是elasticsearch? a一个开源的分布式搜索引擎可以用来实现搜索、日志统计、分析、系统监控等功能 q什么是elastic stack (ELK) ? a是以elasticsearch为核心的技术栈包括beats、Logstash、kibana、elasticsearch q什么是Lucene? a是Apache的开源搜索引擎类库提供了搜索引擎的核心API 正向索引与倒排索引 在理解正向索引与倒排索引之前先理解文档与词条的概念 文档document每条数据就是一个文档 elasticsearch是面向文档存储的可以是数据库中的一条商品数据一个订单信息文档数据会被序列化为json格式后存储在elasticsearch中。 词条term文档按照语义分成的词语索引相同类型的文档的集合 映射索引中文档的字段约束信息类似于表的约束结构 传统数据库比如MySQL使用的是正向索引。通常使用id作为索引 在搜索手机时如果使用select * from 表 where title like %手机%;语句进行查找它会逐条扫描数据然后找到title中的数据后判断是否保存”手机“词条。这样的效率很慢. 而elasticsearch采用倒排索引 数据库与elasticsearch概念对比 安装ES、Kibana与分词器 这里是基于Docker的安装ES也支持windows的安装具体安装方法请参考其他教程。 首先我们需要将ES与Kibana为ES提供一个可视化界面容器互联因此需要先创建一个网络 输入docker命令 docker network create es-net(es-net网络名称自己随便起名) docker pull elasticsearch:版本号 docker pull kibana:版本号两个版本号需要一致docker run -d \ --name es \ -e ES_JAVA_OPTS-Xms512m -Xmx512m \ -e discovery.typesingle-node \ -v es-data:/usr/share/elasticsearch/data \ -v es-plugins:/usr/share/elasticsearch/plugins \ --privileged \ --network es-net \ -p 9200:9200 \ -p 9300:9300 \ elasticsearch:版本号 之后访问9200端口 出现如下格式证明启动成功。 接下来启动kibana docker run -d \ --name kibana \ -e ELASTICSEARCH_HOSTShttp://es:9200 \ --networkes-net \ -p 5601:5601 \ kibana:版本号 启动成功后访问5601端口出现如下界面 ES默认的分词器对中文分词并不友好。因此我们需要下载IK分词器 下载地址GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized dictionary. 下在对应版本并解压到刚刚指定的数据卷。 重启容器 docker restart es IK分词器有两种拆分模式 ik_smart最少切分空间占用更少ik_max_word最细切分切分力度最大文档搜索到的概率更大 下面是两种示例 POST /_analyze {text:观察ik分词器的两种模式,analyzer: ik_max_word } { tokens : [ { token : 观察, start_offset : 0, end_offset : 2, type : CN_WORD, position : 0 }, { token : ik, start_offset : 2, end_offset : 4, type : ENGLISH, position : 1 }, { token : 分词器, start_offset : 4, end_offset : 7, type : CN_WORD, position : 2 }, { token : 分词, start_offset : 4, end_offset : 6, type : CN_WORD, position : 3 }, { token : 器, start_offset : 6, end_offset : 7, type : CN_CHAR, position : 4 }, { token : 的, start_offset : 7, end_offset : 8, type : CN_CHAR, position : 5 }, { token : 两种, start_offset : 8, end_offset : 10, type : CN_WORD, position : 6 }, { token : 两, start_offset : 8, end_offset : 9, type : COUNT, position : 7 }, { token : 种, start_offset : 9, end_offset : 10, type : CN_CHAR, position : 8 }, { token : 模式, start_offset : 10, end_offset : 12, type : CN_WORD, position : 9 } ] } POST /_analyze {text:观察ik分词器的两种模式,analyzer: ik_smart } { tokens : [ { token : 观察, start_offset : 0, end_offset : 2, type : CN_WORD, position : 0 }, { token : ik, start_offset : 2, end_offset : 4, type : ENGLISH, position : 1 }, { token : 分词器, start_offset : 4, end_offset : 7, type : CN_WORD, position : 2 }, { token : 的, start_offset : 7, end_offset : 8, type : CN_CHAR, position : 3 }, { token : 两种, start_offset : 8, end_offset : 10, type : CN_WORD, position : 4 }, { token : 模式, start_offset : 10, end_offset : 12, type : CN_WORD, position : 5 } ] } 分词器作用 创建倒排索引时对文档分词用户搜索时对输入的内容分词 自定义字典 ik分词器之所以可以实现分词是内部存在一个字典根据字典会进行划分。但是有的是时候需要排除某些词语比如说”嗯“”哦“等词语没有划分的意义。又比如说网络梗”打个胶先“等这些不会被识别为一个词语。这个时候我们可以自定义我们的词典。具体修改方式如下。 拓展词库 修改ik分词器插件中的confg目录下的IKAnalyzer.cfg.xml文件 ?xml version1. encodingUTF-8? !DOCTYPE properties SYSTEM http://java.sun.com/dtd/properties.dtd propertiescommentIK Analyzer 扩展配置/comment!--用户可以在这里配置自己的扩展字典 *** 添加扩展词典--entry keyext_dictext.dic/entry /properties 禁用词库 ?xml version1. encodingUTF-8? !DOCTYPE properties SYSTEM http://java.sun.com/dtd/properties.dtd propertiescommentIK Analyzer 扩展配置/comment!--用户可以在这里配置自己的扩展停止词字典 *** 添加停用词词典--entry keyext_stopwordsstopword.dic/entry /properties 配置的文件都需要和IKAnalyzer.cfg.xml在同一目录下。如果不存在就自己创建 索引库操作 Mapping属性 mapping是对索引库中文档的约束常见的mapping属性包括: type字段数据类型常见的简单类型有: 字符串 text 可分词的文本、keyword 精确值例如:品牌、国家、ip地址数值long、integer、short、byte、double、float布尔boolean日期date对象objectindex是否创建索引默认为trueanalyzer使用哪种分词器properties该字段的子字段 ES还支持两种地理坐标数据类型 geo_point由维度和经度确定的一个点geo_shape由多个geo_ponit组成的复杂图形 创建索引库 创建索引库的语法示例如下 PUT /zmbwcx {mappings: {properties: {info:{type: text,analyzer: ik_smart},people:{properties: {name:{type:keyword},sex:{type:keyword}}}} } } 查询索引库 GET /索引库名 删除索引库 DELETE /索引库名 修改索引库 索引库和mapping一旦创建无法进行修改修改会导致原有的倒排索引发生改变影响较大因此无法修改但是可以向其中添加新的字段 文档操作 新增文档 文档id如果不指定会随机生成一个文档id POST /zmbwcx/_doc/1 {info:成功人士,people:{name:zmbwcx,sex:男} } 查找文档 GET /索引库名/_doc/文档id 字段解读 _index索引库名_type查询类型_id文档id_version查询次数_source文档内容 修改文档 全量修改 删除旧文档添加新文档。具体操作和新增文档相同只有请求由POST变为PUT。如果修改的文档id不存在则相当于新增 PUT /索引库名/_doc/文档id {字段1:值1,字段2:值2,// ...略 } 增量修改 POST /索引库名/_update/文档id {doc:{字段名:新的值} } 删除文档 DELETE /索引库名/_doc/文档id RestClient操作索引库 资料下载https://pan.baidu.com/s/1ORJ-jERwZzJMoyWpCrgafw?pwdzmbw mapping要考虑的问题字段名、数据类型、是否参与搜索、是否分词、如果分词分词器是什么? 字段名与数据类型的设计与数据库一样就可以。其余的部分要联合业务决定 具体DSL语句如下我们可以选择在视图界面直接运行如下代码也可以在Java中创建索引库。 PUT /hotel {mappings:{properties:{id:{type:keyword},name:{type:text,analyzer:ik_max_word,copy_to: all},address:{type:keyword,index: false},price:{type:integer},score:{type:integer},brand:{type:keyword,copy_to: all},city:{type:keyword},starName:{type:keyword},business:{type:keyword,copy_to: all},location:{type: geo_point},pic:{type:keyword,index: false},all:{type: text,analyzer: ik_max_word}}} } 如果需要实现搜索一个字段可以查询到多个字段的内容需要使用字段拷贝。 拷贝字段:{type:test,analyzer:ik_max_word }, 被拷贝字段:{copy_to拷贝字段 } 创建好mapping映射后编写Java部分的代码 首先引入依赖这里的版本一定要和docker中安装的版本一样 propertiesjava.version1.8/java.versionelasticsearch.version7.12.1/elasticsearch.version /properties dependenciesdependencygroupIdorg.elasticsearch.client/groupIdartifactIdelasticsearch-rest-high-level-client/artifactId/dependency /dependencies 创建客户端对象并使用该对象创建索引库。 SpringBootTest class HotelDemoApplicationTests {private RestHighLevelClient client;BeforeEach//初始化客户端void setUp() {this.client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://192.168.116.131:9200)));}AfterEachvoid tearDown() throws IOException {this.client.close();}Test//创建索引库public void testCreateIndex() throws Exception {CreateIndexRequest request new CreateIndexRequest(hotel);request.source(MAPPING_TEMPLATE, XContentType.JSON);client.indices().create(request, RequestOptions.DEFAULT);}Test//删除索引库public void testDeleteIndex() throws Exception {DeleteIndexRequest request new DeleteIndexRequest(hotel);client.indices().delete(request,RequestOptions.DEFAULT);}Test//判断索引库是否存在public void testGetIndex() throws Exception {GetIndexRequest request new GetIndexRequest(hotel);boolean exists client.indices().exists(request, RequestOptions.DEFAULT);System.out.println(exists?索引库存在:索引库不存在);} } RestClient操作文档 新增文档 SpringBootTest class TestDoc {private RestHighLevelClient client;Autowiredprivate IHotelService service;BeforeEachvoid setUp() {this.client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://192.168.116.131:9200)));}AfterEachvoid tearDown() throws IOException {this.client.close();}Testpublic void testInsertDoc() throws Exception {//从数据库中查找数据Hotel hotel service.getById(36934);//转换为Mapping相对应的格式HotelDoc hotelDoc new HotelDoc(hotel);//创建添加请求IndexRequest request new IndexRequest(hotel).id(hotelDoc.getId().toString());//准备JSON文档request.source(JSON.toJSONString(hotelDoc),XContentType.JSON);//添加文档client.index(request,RequestOptions.DEFAULT);} } 去可视化界面查询是否插入成功 根据Id查询文档数据 Testpublic void testGetResultById() throws Exception {GetRequest request new GetRequest(hotel,36934);GetResponse response client.get(request, RequestOptions.DEFAULT);String jsonStr response.getSourceAsString();HotelDoc hotelDoc JSON.parseObject(jsonStr, HotelDoc.class);System.out.println(hotelDoc);} 更新文档 更新文档有两种一种是全量更新更改方式与新增文档一模一样。 另一种是局部更新代码如下 Testpublic void testUpdateDoc() throws Exception {UpdateRequest request new UpdateRequest(hotel,36934);//参数类似于k:v但不同的是不是使用:而是,分割每两个作为一个kv。第三个参数作为krequest.doc(price,300);client.update(request,RequestOptions.DEFAULT);} 删除文档 Testpublic void testDeleteDoc() throws Exception {DeleteRequest request new DeleteRequest(hotel,36934);client.delete(request,RequestOptions.DEFAULT);} 批量新增 Testpublic void testInsertDocs() throws Exception {ListHotel list service.list();ListHotelDoc listHotelDocs list.stream().map(hotel - new HotelDoc(hotel)).collect(Collectors.toList());BulkRequest bulkRequest new BulkRequest();for (HotelDoc hotelDoc : listHotelDocs) {bulkRequest.add(new IndexRequest(hotel).id(hotelDoc.getId().toString()).source(JSON.toJSONString(hotelDoc),XContentType.JSON));}client.bulk(bulkRequest,RequestOptions.DEFAULT);} DSL查询语法 查询所有 但实际上有条数限制为10条 GET /hotel/_search {query: {match_all: {}} } 全文检索 会对用户输入的数据经过分词器处理后搜索文档常用于搜索框 一种是match搜索 GET /hotel/_search {query: {match: {all: 北京}} } 一种是multi_match可以查询多个字段 GET /hotel/_search {query: {multi_match: {query: 北京如家,fields: [brand,name,business]}} } 两种查询效果基本相同但第二种查询的索引更多速度更慢些所以更推荐通过拷贝的方式只查询一个索引。 精确查询 精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词。 term根据词条精确值查询range根据值的范围查询 查询北京地区的旅店信息 GET /hotel/_search {query: {term: {city: {value: 北京}}} } 查询价格区间的旅店信息 GET /hotel/_search {query: {range: {price: {gte: 100,lte: 200}}} } 地理查询 geo_bounding_box查询方式。 geo_distance查询方式 复合查询 复合查询可以将其他简单的查询组合起来实现更复杂的搜索逻辑 fuction score算分函数查询可以控制文档相关性算分控制文档排名 boolean query布尔查询是一个或多个查询子句的组合。子查询的组合方式有 must必须匹配每个子查询类似”与“should选择性匹配子查询类似”或“must_not必须不匹配不参与算分类似”非“filter必须匹配不参与算分 参与算分的条件越多性能越差 搜索结果处理 排序 默认根据相关度算分_score排序但是可以自定义排序规则比如说价格或是日期如果指定其他排序则放弃算分性能更好 按用户评分降序价格升序查询 GET /hotel/_search {query: {match_all: {}},sort: [{score: desc},{price: asc}] } 分页 ES中默认一次查询出10条数据。如果需要获取更多的数据需要修改分页参数 #分页查询 GET /hotel/_search {query: {match_all: {}},from: 10, //从第十条开始查找size: 20 //查询20条数据 } 分页存在的问题 ES和数据库不同ES做的是逻辑分页也就是查询出前30条数据然后截取10之后的20条数据。其次ES通常为了存储更多文档都是集群工作会将文档拆分到不同节点上。如果我们以价格升序排序后截取50-60的文档那么实际上是每个节点都进行排序后每个节点数据集合到内存后再次重新排序后再去截取50-60的数据。 如果搜索的页数过深或者结果集fromsize过大对内存和CPU消耗越高因此ES设定结果集上限为1000 高亮 GET /hotel/_search {query: {match: {all: 北京}},highlight: {fields: {name: {require_field_match: false //取消字段匹配}}} } ES默认情况下ES的搜索字段必须与高亮字段名一致。如果不需要一致则需要添加配置 RestClient查询文档 查询全部 查询文档 Testpublic void testSearchMatchAll() throws Exception {SearchRequest request new SearchRequest(hotel);//准备DSLrequest.source().query(QueryBuilders.matchAllQuery());SearchResponse response client.search(request, RequestOptions.DEFAULT);System.out.println(response);} 解析数据 结合JSON格式进行解析数据 Testpublic void testSearchMatchAll() throws Exception {SearchRequest request new SearchRequest(hotel);//准备DSLrequest.source().query(QueryBuilders.matchAllQuery());SearchResponse response client.search(request, RequestOptions.DEFAULT);System.out.println(response);SearchHits searchHits response.getHits();long totalNum searchHits.getTotalHits().value;SearchHit[] hits searchHits.getHits();for (SearchHit hit : hits) {HotelDoc hotelDoc JSON.parseObject(hit.getSourceAsString(), HotelDoc.class);System.out.println(hotelDoc);}System.out.println(一共查询到:totalNum条);} 全文检索查询 Testpublic void testSearchMatch() throws Exception {SearchRequest request new SearchRequest(hotel);request.source().query(QueryBuilders.matchQuery(all,北京));SearchResponse response client.search(request, RequestOptions.DEFAULT);SearchHits searchHits response.getHits();long totalNum searchHits.getTotalHits().value;SearchHit[] hits searchHits.getHits();for (SearchHit hit : hits) {HotelDoc hotelDoc JSON.parseObject(hit.getSourceAsString(), HotelDoc.class);System.out.println(hotelDoc);}System.out.println(一共查询到:totalNum条);} 与MatchAll的查询方式基本无异。多了个指定字段与查询内容 精确查询 复合查询 排序和分页 Testpublic void testSearchPage() throws Exception {SearchRequest request new SearchRequest(hotel);request.source().query(QueryBuilders.matchQuery(all,北京));request.source().from(10).size(5);request.source().sort(price, SortOrder.ASC);SearchResponse response client.search(request, RequestOptions.DEFAULT);SearchHits searchHits response.getHits();long totalNum searchHits.getTotalHits().value;SearchHit[] hits searchHits.getHits();for (SearchHit hit : hits) {HotelDoc hotelDoc JSON.parseObject(hit.getSourceAsString(), HotelDoc.class);System.out.println(hotelDoc);}System.out.println(一共查询到:totalNum条);} 高亮 Testpublic void testHighLight() throws Exception {SearchRequest request new SearchRequest(hotel);request.source().query(QueryBuilders.matchQuery(all,北京));request.source().highlighter(new HighlightBuilder().field(name).requireFieldMatch(false));SearchResponse response client.search(request, RequestOptions.DEFAULT);SearchHits searchHits response.getHits();SearchHit[] hits searchHits.getHits();for (SearchHit hit : hits) {HotelDoc hotelDoc JSON.parseObject(hit.getSourceAsString(), HotelDoc.class);MapString, HighlightField highlightFields hit.getHighlightFields();if (!CollectionUtils.isEmpty(highlightFields)){HighlightField field highlightFields.get(name);if (field!null){String value field.getFragments()[0].string();hotelDoc.setName(value);}}System.out.println(hotelDoc);}}
http://www.yayakq.cn/news/4466/

相关文章:

  • 新公司名称核准在哪个网站韶关网站开发
  • 在视频网站中做节目怎么挣钱建设网站目的及功能定位
  • 如何快速的建设网站如何创建wordpress数据库文件
  • 网站建设咨询费用外发加工网1688
  • 继续访问这个网站互联网舆情忻州
  • 如何建设网站论坛高端私人订制网站建设
  • 建设部物业证书查询官方网站悬停提示 wordpress
  • 上海建设摩托车官方网站店铺详情页设计
  • 台州网站策划台州网站策划写作平台有哪些
  • 网站建设图标图片湖北建设网
  • 网站打开很慢怎么做优化手机网站底部导航
  • 外贸soho怎么做网站做海外购网站
  • dw做网站首页怎么做网页设计与网站的关系
  • 罗湖区网站公司ui设计培训班需要学几个月
  • 网站建设评审验收会议主持词做企业网站和邮箱
  • 阿克苏网站开发牛魔王网站建设
  • 加强检察门户网站建设情况文档阅读网站模板下载
  • 做高仿网站网站建设与设计ppt模板
  • 厦门哪家做网站好电子商务网站开发环境示范
  • 周口网站设计网站做的一样算不算侵权
  • 网站建设提供书面资料清单Wordpress4.0参考手册.CHM
  • APP和网站是一样吗网站转化路径
  • 网站页面切换效果长春网站建设技术外包
  • 自己搭建服务器做网站网站网络排名优化方法
  • 如何做网站首页图电商发展趋势和未来
  • 网站备案查询工具xenforo和wordpress
  • 微网站首选公司淘宝客推广有效果吗
  • 短裙怎么做视频网站沧州国外网站建设
  • 网站域名是不是网址在线生成电子印章
  • ps做网站logo门户网站建站系统