网站建设吗wordpress打赏链接怎么实现

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

网站建设吗,wordpress打赏链接怎么实现,wordpress百度搜索无缩略图,能交易的网站多少钱#x1f697;Es学习第四站~ #x1f6a9;Es学习起始站#xff1a;【微服务】Elasticsearch概述环境搭建(一) #x1f6a9;本文已收录至专栏#xff1a;微服务探索之旅 #x1f44d;希望您能有所收获 在第二站的学习中#xff0c;我们已经导入了大量数据到es中… Es学习·第四站~ Es学习起始站【微服务】Elasticsearch概述环境搭建(一) 本文已收录至专栏微服务探索之旅 希望您能有所收获 在第二站的学习中我们已经导入了大量数据到es中实现了数据存储功能。接下来如需看自己实操效果请根据第二站的三.环境搭建部分导入初始数据。 一.数据聚合 (1) 聚合的作用 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如 什么品牌的手机最受欢迎这些手机的平均价格、最高价格、最低价格这些手机每月的销售情况如何 实现这些统计功能的比数据库的sql要方便的多而且查询速度非常快可以实现近实时搜索效果。 (2) 聚合的种类 聚合常见的有三类 桶Bucket聚合用来对文档做分组 TermAggregation按照文档字段值分组例如按照品牌值分组、按照国家分组Date Histogram按照日期阶梯分组例如一周为一组或者一月为一组 度量Metric聚合用以计算一些值比如最大值、最小值、平均值等 Avg求平均值Max求最大值Min求最小值Stats同时求max、min、avg、sum等 管道pipeline聚合其它聚合的结果为基础做聚合
注意参加聚合的字段必须是keyword、日期、数值、布尔类型 (3) Bucket聚合 如果我们要统计所有数据中的酒店品牌有几种其实就是按照品牌对数据分组。此时可以根据酒店品牌的名称做聚合也就是Bucket聚合。 (3.1) 基本使用 语法如下 GET /hotel/_search {size: 0, // 设置size为0设置结果中不包含文档只包含聚合结果aggs: { // 定义聚合brandAgg: { //给聚合起个名字terms: { // 聚合的类型按照品牌值聚合所以选择termfield: brand, // 参与聚合的字段size: 20 // 希望获取的聚合结果数量}}} }结果如图
doc_count为聚合分组后其中文档的数量。 (3.2) 结果排序 默认情况下Bucket聚合会统计Bucket内的文档数量记为_count并且按照_count降序排序。 我们可以通过指定order属性自定义聚合的排序方式 GET /hotel/_search {size: 0, aggs: {brandAgg: {terms: {field: brand,order: {_count: asc // 按照_count升序排列},size: 20}}} }(3.3) 限定范围 默认情况下Bucket聚合是对索引库的所有文档做聚合但真实场景下只会对用户搜索的结果聚合。因此上述聚合必须添加限定条件。 我们要限定聚合的文档范围只需添加query条件即可 GET /hotel/_search {query: {range: {price: {lte: 200 // 只对200元以下的文档聚合}}}, size: 0, aggs: {brandAgg: {terms: {field: brand,size: 20}}} }这次聚合得到的品牌明显变少了
(4) Metric聚合 上述我们通过使用Bucket聚合对酒店按照品牌分组形成了一个个桶。现在我们需要对桶内的酒店做运算获取每个品牌的用户评分的min、max、avg等值。 这就要用到Metric聚合了例如stat聚合就可以获取min、max、avg等结果。 语法如下 GET /hotel/_search {size: 0, aggs: {brandAgg: { terms: { field: brand, size: 20},aggs: { // 是brands聚合的子聚合也就是分组后对每组分别计算score_stats: { // 聚合名称stats: { // 聚合类型这里stats可以计算min、max、avg等field: score // Metric聚合字段这里是score}}}}} }这里的score_stats聚合是在brandAgg的聚合内部嵌套的子聚合。因为我们需要在每个桶分别计算。 另外我们还可以给聚合结果做个排序例如按照每个桶的酒店平均分做排序
(5) RestAPI实现聚合 (5.1) 基础语法 聚合条件与query条件同级别因此需要使用request.source()来指定聚合条件。 聚合条件的语法
聚合的结果也与查询结果不同API也比较特殊。不过同样是JSON逐层解析
(5.2) 使用示例 需求查询杭州的所有酒店分类数据。 Test void tesAggregationt( ) {// 1.准备RequestSearchRequest request new SearchRequest(hotel);// 2.准备DSL// 2.1.queryrequest.source().query(QueryBuilders.termQuery(city,杭州));// 2.2.设置sizerequest.source().size(0);// 2.3.聚合request.source().aggregation(AggregationBuilders.terms(brandAgg).field(brand).size(100));// 3.发出请求SearchResponse response client.search(request, RequestOptions.DEFAULT);// 4.解析结果Aggregations aggregations response.getAggregations();// 4.1.根据聚合名称获取聚合结果Terms brandTerms aggregations.get(aggName);// 4.2.获取bucketsList? extends Terms.Bucket buckets brandTerms.getBuckets();// 4.3.遍历打印结果for (Terms.Bucket bucket : buckets) {// 4.4.获取keyString key bucket.getKeyAsString();System.out.println(key);} } 运行可以看到我们成功查出了酒店数据
二.自动补全 当用户在搜索框输入字符时我们应该提示出与该字符有关的搜索项如图
这种根据用户输入的字母提示完整词条的功能就是自动补全了。 (1) 拼音分词器 要实现根据字母做补全就必须对文档按照拼音分词这时就需要自己配置拼音分词功能,在GitHub上恰好有elasticsearch的拼音分词插件。
链接https://pan.baidu.com/s/1eSlsQ6ypaDNkqXO75mC6IA 提取码3yzw 资料中也提供了拼音分词器的安装包
安装步骤 连接服务器切换到es绑定的插件数据卷中 cd /var/lib/docker/volumes/es-plugins/_data2. 将压缩包上传至此目录并解压unzip elasticsearch-analysis-pinyin-7.12.1.zip -d py​ 3. 重启elasticsearch docker restart es测试用法 POST /_analyze {text: 如家酒店还不错,analyzer: pinyin }结果
如上可以看到我们已经成功安装好了拼音分词器。但是它还存在一些问题无法直接使用接下来让我们一起解决吧。 (2) 自定义分词器 (2.1) 概述 默认的拼音分词器会将每个汉字单独分为拼音而我们所希望的是每个词条形成一组拼音因此需要对拼音分词器做个性化定制形成自定义分词器。 elasticsearch中分词器analyzer的组成包含三部分 character filters在tokenizer之前对文本进行处理。例如删除字符、替换字符tokenizer将文本按照一定的规则切割成词条term。例如keyword就是不分词还有ik_smarttokenizer filter将tokenizer输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等 文档分词时会依次由这三部分来处理文档
(2.2) 使用 我们在可以在创建索引库时通过settings来配置自定义的analyzer(分词器)。 声明自定义分词器的语法如下 PUT /test // 创建索引库 {settings: {analysis: {analyzer: { // 自定义分词器my_analyzer: { // 自定义分词器名称tokenizer: ik_max_word, // 切割词条filter: py // 自定义拼音处理方式}},filter: { // 自定义tokenizer filterpy: { // 过滤器名称type: pinyin, // 过滤器类型这里是pinyinkeep_full_pinyin: false,keep_joined_full_pinyin: true,keep_original: true,limit_first_letter_length: 16,remove_duplicated_term: true,none_chinese_pinyin_tokenize: false}}}},mappings: {properties: {name: { // 定义字段type: text, // 定义类型analyzer: my_analyzer, // 定义字段分词器search_analyzer: ik_smart }}} }拼音分词器filter属性详细配置介绍可以看官方文档拼音分词插件。 测试
(2.3) 补充 拼音分词器适合在创建倒排索引的时候使用但不适合在搜索的时候使用这是为了避免搜索时搜到到同音字。
改进使用 PUT /test
{settings: {analysis: {analyzer: { my_analyzer: { tokenizer: ik_max_word, filter: py }},filter: { py: {…}}}},mappings: {properties: {name: { type: text, analyzer: my_analyzer, // 指定创建倒排索引分词器search_analyzer: ik_smart // 指定搜索时分词器}}} }我们可以在配置中指定两个分词器一个用于创建倒排索引一个用于搜索。 (3) 自动补全查询 es提供了Completion Suggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。为了提高补全查询的效率对于文档中字段的类型有一些约束 参与补全查询的字段必须是completion类型。 字段的内容一般是用来补全的多个词条形成的数组。
比如一个这样的索引库 // 创建索引库 PUT test {mappings: {properties: {title:{type: completion}}} }然后插入下面的数据 // 示例数据 POST test/_doc {title: [Sony, WH-1000XM3] } POST test/_doc {title: [SK-II, PITERA] } POST test/_doc {title: [Nintendo, switch] }查询的DSL语句如下 // 自动补全查询 GET /test/_search {suggest: {title_suggest: {text: s, // 查询时待补全关键字completion: {field: title, // 补全查询的字段skip_duplicates: true, // 跳过重复的size: 10 // 获取前10条结果}}} }测试结果
如上可以看到我们已经成功实现了自动补全功能接下来让我们一起用Java代码来实现一下。 (4) RestAPI实现自动补全 (4.1) 基础语法 先让我们看看发送请求代码对比
自动补全结果解析的代码如下
(4.2) 使用示例 Test void testSuggester() {// 1.准备RequestSearchRequest request new SearchRequest(hotel);// 2.准备DSLrequest.source().suggest(new SuggestBuilder().addSuggestion(suggestions,SuggestBuilders.completionSuggestion(suggestion).prefix(h).skipDuplicates(true).size(10)));// 3.发起请求SearchResponse response client.search(request, RequestOptions.DEFAULT);// 4.解析结果Suggest suggest response.getSuggest();// 4.1.根据补全查询名称获取补全结果CompletionSuggestion suggestions suggest.getSuggestion(suggestions);// 4.2.获取optionsListCompletionSuggestion.Entry.Option options suggestions.getOptions();// 4.3.遍历打印for (CompletionSuggestion.Entry.Option option : options) {String text option.getText().toString();System.out.println(text)} }运行可以看到我们已经成功获取到补全结果
三.数据同步方案 本处不涉及代码方案实现可以看项目实战篇 (1) 引入 es中的数据来自于mysql数据库因此mysql数据发生改变时es也必须跟着改变这个就是elasticsearch与mysql之间的数据同步。
(2) 思路分析 常见的数据同步方案有三种 同步调用异步通知监听binlog (2.1 ) 同步调用 方案一同步调用
基本步骤如下 hotel-demo服务对外提供接口用来修改elasticsearch中的数据酒店管理服务在完成数据库操作后直接调用hotel-demo服务提供的修改接口 (2.2) 异步通知 方案二异步通知
流程如下 hotel-admin服务对mysql数据库数据完成增、删、改后发送MQ消息hotel-demo服务监听MQ接收到消息后完成elasticsearch数据修改 (2.3) 监听binlog 方案三监听binlog
流程如下 给mysql开启binlog功能mysql完成增、删、改操作都会记录在binlog中hotel-demo基于canal监听binlog变化实时更新elasticsearch中的内容 (2.4) 优缺点对比 方式一同步调用 优点实现简单粗暴缺点业务耦合度高 方式二异步通知 优点低耦合实现难度一般缺点依赖mq的可靠性 方式三监听binlog 优点完全解除服务间耦合缺点开启binlog增加数据库负担、实现复杂度高