全文搜索

  • match 使用operator : and提升精度
GET /my_index/my_type/_search
{"query": {"match": {"title": {      "query":    "BROWN DOG!","operator": "and"}}}
}
  • match 使用 minimum_should_match控制精度
GET /my_index/my_type/_search
{"query": {"match": {"title": {"query":                "quick brown dog","minimum_should_match": "75%"    }}}
}
GET /my_index/my_type/_search
{"query": {"bool": {"should": [{ "match": { "title": "brown" }},{ "match": { "title": "fox"   }},{ "match": { "title": "dog"   }}],"minimum_should_match": 2     //(这也可以用数字表示。)}}
}
  • 使用boost提升查询条件的权重(boost)默认为1

https://www.elastic.co/guide/cn/elasticsearch/guide/cn/_boosting_query_clauses.html

GET /_search
{"query": {"bool": {"must": {"match": {  "content": {"query":    "full text search","operator": "and"}}},"should": [{ "match": {"content": {"query": "Elasticsearch","boost": 3 }}},{ "match": {"content": {"query": "Lucene","boost": 2 }}}]}}
}

多字段搜索

单字符串查询的三种情形

https://www.elastic.co/guide/cn/elasticsearch/guide/cn/_single_query_string.html

  • 最佳字段

评分也来自于 最匹配字段 。(评分最高的字段)

  • 多数字段

为了对相关度进行微调,常用的一个技术就是将相同的数据索引到不同的字段,它们各自具有独立的分析链。(评分来自于多个字段,更加精确)

  • 混合字段

对于某些实体,我们需要在多个字段中确定其信息,单个字段都只能作为整体的一部分,在这种情况下,我们希望在 任何 这些列出的字段中找到尽可能多的词,这有如在一个大字段中进行搜索,这个大字段包括了所有列出的字段。

最佳字段

dis_max 查询-最大化查询

将任何与任一查询匹配的文档作为结果返回,但只将最佳匹配的评分作为查询的评分结果返回

{"query": {"dis_max": {"queries": [{ "match": { "title": "Brown fox" }},{ "match": { "body":  "Brown fox" }}]}}
}
  • tie-breaker 最大化查询调优

可以通过指定 tie_breaker 这个参数将其他匹配语句的评分也考虑其中:

{"query": {"dis_max": {"queries": [{ "match": { "title": "Quick pets" }},{ "match": { "body":  "Quick pets" }}],"tie_breaker": 0.3}}
}

multi_match 多字段匹配

https://www.elastic.co/guide/cn/elasticsearch/guide/cn/multi-match-query.html#multi-match-query

multi_match 多匹配查询的类型有多种,其中的三种恰巧与 了解我们的数据 中介绍的三个场景对应,即: best_fields 、 most_fields 和 cross_fields (最佳字段、多数字段、跨字段)。

默认情况下,查询的类型是 best_fields , 这表示它会为每个字段生成一个 match 查询,然后将它们组合到 dis_max 查询的内部

{"multi_match": {"query":                "Quick brown fox","type":                 "best_fields", "fields":               [ "title", "body" ],"tie_breaker":          0.3,"minimum_should_match": "30%" }
}
  • 模糊匹配
{"multi_match": {"query":  "Quick brown fox","fields": "*_title"}
}
  • 提升单个字段的权重
{"multi_match": {"query":  "Quick brown fox","fields": [ "*_title", "chapter_title^2" ] }
}

多数字段 most_fields

召回率与精确率
  • 召回率 ——返回所有的相关文档;
  • 精确率 ——不返回无关文档。目的是在结果的第一页中为用户呈现最为相关的文档。
多字段映射提高召回率
  • 修改索引,使用multifields对一个字段索引2次
DELETE /my_indexPUT /my_index
{"settings": { "number_of_shards": 1 }, "mappings": {"my_type": {"properties": {"title": { "type":     "string","analyzer": "english","fields": {"std":   { "type":     "string","analyzer": "standard"}}}}}}
}
  • 使用multi_match,模式为most_fields多字段
GET /my_index/_search
{"query": {"multi_match": {"query":  "jumping rabbits","type":   "most_fields", "fields": [ "title", "title.std" ]}}
}

跨字段实体搜索(重要)

https://www.elastic.co/guide/cn/elasticsearch/guide/cn/_cross_fields_entity_search.html

目的:在 多字符串查询 中,我们为每个字段使用不同的字符串,在本例中,我们想使用 单个 字符串在多个字段中进行搜索

字段中心化查询所遇到的三大问题

https://www.elastic.co/guide/cn/elasticsearch/guide/cn/field-centric.html

most_fields best_fields 的问题都因为它是 字段中心式(field-centric) 而不是 词中心式(term-centric) 的:当真正感兴趣的是匹配词的时候,它为我们查找的是最匹配的 字段 。

解决方法

  • 自定义_all字段

https://www.elastic.co/guide/cn/elasticsearch/guide/cn/custom-all.html

  • 使用cross-fields 跨字段查询

https://www.elastic.co/guide/cn/elasticsearch/guide/cn/_cross_fields_queries.html

cross_fields 类型首先分析查询字符串并生成一个词列表,然后它从所有字段中依次搜索每个词。这种不同的搜索方式很自然的解决了 字段中心式 查询三个问题中的二个。

GET /_validate/query?explain
{"query": {"multi_match": {"query":       "peter smith","type":        "cross_fields", "operator":    "and","fields":      [ "first_name^2", "last_name" ]}}
}

它通过 混合 不同字段逆向索引文档频率的方式解决了词频的问题,它会同时在 first_name 和 last_name 两个字段中查找 smith 的 IDF ,然后用两者的最小值作为两个字段的 IDF 。结果实际上就是 smith 会被认为既是个平常的姓,也是平常的名。

为了让 cross_fields 查询以最优方式工作,所有的字段都须使用相同的分析器, 具有相同分析器的字段会被分组在一起作为混合字段使用。

在 multi_match 查询中避免使用 not_analyzed 字段(精确值字段)。

近似匹配

近似匹配是为了解决匹配单词的语意语序问题,为我们找出更加精准的结果。

短语匹配

match_phrase

match_phrase 查询首先将查询字符串解析成一个词项列表,然后对这些词项进行搜索,但只保留那些包含 全部 搜索词项,且 位置 与搜索词项相同的文档。

GET /my_index/my_type/_search
{"query": {"match_phrase": {"title": "quick brown fox"}}
}

或者

"match": {"title": {"query": "quick brown fox","type":  "phrase"}
}

slop 混合匹配

https://www.elastic.co/guide/cn/elasticsearch/guide/current/slop.html

多值字段

对于多值字段,

PUT /my_index/groups/1
{"names": [ "John Abraham", "Lincoln Smith"]
}

需要设置

PUT /my_index/_mapping/groups
{"properties": {"names": {"type":                "string","position_increment_gap": 100}}
}

获得的position

Position 1: john
Position 2: abraham
Position 103: lincoln
Position 104: smith

这样,我们的短语查询Abraham Lincoln就无法匹配该文档,因为 abraham 和 lincoln 之间的距离为 100 。 为了匹配这个文档你必须添加值为 100 的 slop

越近越好

使用slop虽然可以混合匹配,但是距离越近的得分会越高

短语查询性能优化

GET /my_index/my_type/_search
{"query": {"match": {  # match 查询决定哪些文档将包含在最终结果集中,并通过 TF/IDF 排序。"title": {"query":                "quick brown fox","minimum_should_match": "30%"}}},"rescore": {"window_size": 50, # window_size 是每一分片进行重新评分的顶部文档数量。"query": {         "rescore_query": {"match_phrase": {"title": {"query": "quick brown fox","slop":  50}}}}}
}

对查询结果集的前几页进行单独的重新计算分数,可以优化性能

最佳解决方案,寻找相关词

https://www.elastic.co/guide/cn/elasticsearch/guide/current/shingles.html

  • 创建Shingles分析器
  • 设置多字段方便索引
  • 搜索shingles匹配多字段

部分匹配

prefix前缀匹配

  • 前缀匹配prefix一般用于精确值匹配
  • prefix 查询不做相关度评分计算,只返回匹配到的文档
  • prefix 相当于prefix过滤,唯一的区别就是prefix会做缓存
  • 数据量很大时,prefix会很吃资源,可以使用较长的前缀来限制这种影响,减少需要访问的量。
GET /my_index/address/_search
{"query": {"prefix": {"postcode": "W1"}}
}

通配符与正则表达式查询

https://www.elastic.co/guide/cn/elasticsearch/guide/current/_wildcard_and_regexp_queries.html

wildcard 和 regexp 查询的工作方式与 prefix 查询完全一样,它们也需要扫描倒排索引中的词列表才能找到所有匹配的词,然后依次获取每个词相关的文档 ID ,与 prefix 查询的唯一不同是:它们能支持更为复杂的匹配模式。

这也意味着需要同样注意前缀查询存在性能问题,对有很多唯一词的字段执行这些查询可能会消耗非常多的资源,所以要避免使用左通配这样的模式匹配(如: *foo 或 .*foo 这样的正则式)。

数据在索引时的预处理有助于提高前缀匹配的效率,而通配符和正则表达式查询只能在查询时完成,尽管这些查询有其应用场景,但使用仍需谨慎。

查询时输入即搜索

查询即搜索,如果用户输入 johnnie walker bl ,我们希望在它们完成输入搜索条件前就能得到:Johnnie Walker Black Label 和 Johnnie Walker Blue Label 。

{"match_phrase_prefix" : {"brand" : {"query":          "johnnie walker bl","max_expansions": 50}}
}
  • match_phrase_prefix永远只会以用户搜索的最后一个词作为前缀匹配,然后再将匹配到的词作为最后一个词再次匹配
  • 当用户每多输入一个字符时,这个查询又会执行一遍,所以查询需要快,如果第一个结果集不是用户想要的,他们会继续输入直到能搜出满意的结果为止。

Ngrams滑动窗口,优化部分匹配

https://www.elastic.co/guide/cn/elasticsearch/guide/current/_ngrams_for_partial_matching.html

  • 创建分析器,用于分析字段
  • 在索引时,给字段配置Ngrams分析器,分析多个结果存放于倒序索引中(用空间换时间)
  • 为了解决在搜索时没有匹配整个单词的问题,需要在搜索时添加分析器为standard进行完全匹配,或者在字段的映射中设置search_analyzer为standard
  • 当查询的字段为精确字段时,设置分析器,使用 keyword 分词器将邮编转换成 token 流,这样就能使用边界 n-gram token 过滤器

控制相关度

布尔模型

布尔模型(Boolean Model) 只是在查询中使用 AND 、 OR 和 NOT (与、或和非)这样的条件来查找匹配的文档,以下查询:

full AND text AND search AND (elasticsearch OR lucene)

会将所有包括词 full 、 text 和 search ,以及 elasticsearch 或 lucene 的文档作为结果集。

布尔模型用于查找包含匹配词的文档

决定词的权重的三个因素

词频(TF)

词频是指词在文档中出现的频率,频率越高,权重越高。

  • 词频的计算方式
tf(t in d) = √frequency

词 t 在文档 d 的词频( tf )是该词在文档中出现次数的平方根。

  • 禁用词频统计
PUT /my_index
{"mappings": {"doc": {"properties": {"text": {"type":          "string","index_options": "docs" }}}}
}

not_analyzed 字段默认禁用

逆向文档频率(IDF)

逆向文档频率指词在集合所有文档里出现的频率,频次越高,权重越低

  • 计算公式
idf(t) = 1 + log ( numDocs / (docFreq + 1))

词 t 的逆向文档频率( idf )是:索引中文档数量除以所有包含该词的文档数,然后求其对数。

字段长度归一化

字段的长度是多少? 字段越短,字段的权重 越高

  • 计算公式
norm(d) = 1 / √numTerms

字段长度归一值( norm )是字段中词数平方根的倒数

注:这里的字段指的是索引中的字段

  • 禁用字段长度归一化
PUT /my_index
{"mappings": {"doc": {"properties": {"text": {"type": "string","norms": { "enabled": false } }}}}
}

这个字段不会将字段长度归一值考虑在内,长字段和短字段会以相同长度计算评分。

对于not analyzed的string字段默认是禁用的。

结合使用

以下三个因素——词频(term frequency)、逆向文档频率(inverse document frequency)和字段长度归一值(field-length norm)——是在索引时计算并存储的。 最后将它们结合在一起计算单个词在特定文档中的 权重 。

向量空间模型(vector space model)

当查询多个词时,用于合并多词的权重

向量空间模型提供一种比较多词查询的方式,单个评分代表文档与查询的匹配程度,为了做到这点,这个模型将文档和查询都以 向量(vectors) 的形式表示:

向量实际上就是包含多个数的一维数组,例如:

[1,2,5,22,3,8]

在向量空间模型里, 向量空间模型里的每个数字都代表一个词的 权重 ,与 词频/逆向文档频率(term frequency/inverse document frequency) 计算方式类似。

https://www.elastic.co/guide/cn/elasticsearch/guide/current/scoring-theory.html

Lucene 的实用评分函数

对于多词查询, Lucene 使用 布尔模型(Boolean model) 、 TF/IDF 以及 向量空间模型(vector space model) ,然后将它们组合到单个高效的包里以收集匹配文档并进行评分计算。

https://www.elastic.co/guide/cn/elasticsearch/guide/current/practical-scoring-function.html

查询归一化因子(queryNorm)

查询归一因子 ( queryNorm )试图将查询 归一化 , 这样就能将两个不同的查询结果相比较。

  • 计算公式
queryNorm = 1 / √sumOfSquaredWeights

sumOfSquaredWeights 是查询里每个词的 IDF 的平方和。

协调因子(coord)

协调因子 ( coord ) 可以为那些查询词包含度高的文档提供奖励,文档里出现的查询词越多,它越有机会成为好的匹配结果。

  • 协调因子将评分与文档里匹配词的数量相乘,然后除以查询里所有词的数量。
  • 协调因子能使包含所有三个词的文档比只包含两个词的文档评分要高出很多。

禁用协调因子的情况

当查找同义词 jumpleaphop 时,并不关心会出现多少个同义词,因为它们都表示相同的意思

GET /_search
{"query": {"bool": {"disable_coord": true,"should": [{ "term": { "text": "jump" }},{ "term": { "text": "hop"  }},{ "term": { "text": "leap" }}]}}
}

索引时字段层权重提升(索引时存储的boost)不推荐使用

  • 计算公式
norm(t,d) 是 字段长度归一值 ,与 索引时字段层 boost (如果存在)的和
norm(t,d) = boost + norm(d)

在索引时为字段添加boost可以提升字段权重,但这种做法并不推荐(笨拙,不灵活,丢失精度),因此使用更为简单、清楚、灵活的查询时赋予权重(boost)来替代他。

查询时的权重提升

GET /_search
{"query": {"bool": {"should": [{"match": {"title": {"query": "quick brown fox","boost": 2 }}},{"match": { "content": "quick brown fox"}}]}}
}

title 查询语句的重要性是 content 查询的 2 倍,因为它的权重提升值为 2 (默认为1)。

也可以用于提升索引的权重

https://www.elastic.co/guide/cn/elasticsearch/guide/current/query-time-boosting.html

t.getBoost()

使用查询结构修改来提升相应权重

https://www.elastic.co/guide/cn/elasticsearch/guide/current/query-scoring.html

boosting 权重提升查询(也可以用作降低某些值的权重)

GET /_search
{"query": {"boosting": {"positive": {"match": {"text": "apple"}},"negative": {"match": {"text": "pie tart fruit crumble tree"}},"negative_boost": 0.5}}
}

boosting查询会将那些除positive外同时匹配到negative的文档的权重乘以negative_boost(必须在0-1之间),以此来降低这些文档的权重,但又不将至排除

忽略 TF/IDF

使用constant_sorce查询忽略 TF/IDF

在 constant_score 查询中,它可以包含查询或过滤,为任意一个匹配的文档指定评分 1 ,忽略 TF/IDF 信息:

GET /_search
{"query": {"bool": {"should": [{ "constant_score": {"query": { "match": { "description": "wifi" }}}},{ "constant_score": {"query": { "match": { "description": "garden" }}}},{ "constant_score": {"query": { "match": { "description": "pool" }}}}]}}
}

或许不是所有的设施都同等重要——对某些用户来说有些设施更有价值。如果最重要的设施是游泳池,那我们可以为更重要的设施增加权重:

GET /_search
{"query": {"bool": {"should": [{ "constant_score": {"query": { "match": { "description": "wifi" }}}},{ "constant_score": {"query": { "match": { "description": "garden" }}}},{ "constant_score": {"boost":   2 "query": { "match": { "description": "pool" }}}}]}}
}

注:最终的评分并不是所有匹配语句的简单求和, 协调因子(coordination factor) 和 查询归一化因子(query normalization factor) 仍然会被考虑在内。

我们可以给 features 字段加上 not_analyzed 类型来提升度假屋文档的匹配能力:

{ "features": [ "wifi", "pool", "garden" ] }
默认情况下,一个 not_analyzed 字段会禁用 字段长度归一值(field-length norms) 的功能, 并将 index_options 设为 docs 选项,禁用 词频 ,但还是存在问题:每个词的 倒排文档频率 仍然会被考虑。

可以采用与之前相同的方法 constant_score 查询来解决这个问题:

GET /_search
{"query": {"bool": {"should": [{ "constant_score": {"query": { "match": { "features": "wifi" }}}},{ "constant_score": {"query": { "match": { "features": "garden" }}}},{ "constant_score": {"boost":   2"query": { "match": { "features": "pool" }}}}]}}
}

function_score 查询

使用field_value_factor将其他字段纳入考虑因素

再查询popularity时,同时将votes(点赞数)高的_score分数提高

GET /blogposts/post/_search
{"query": {"function_score": { "query": { "multi_match": {"query":    "popularity","fields": [ "title", "content" ]}},"field_value_factor": { "field": "votes" }}}
}

1.function_score 查询将主查询和函数包括在内。

2.主查询优先执行。

3.field_value_factor 函数会被应用到每个与主 query 匹配的文档。

4.每个文档的 votes 字段都 必须 有值供 function_score 计算。如果 没有 文档的 votes 字段有值,那么就 必须 使用 missing 属性 提供的默认值来进行评分计算。

最终每个文档的评分都做了如下修改:

new_score = old_score * number_of_votes

但是会存在问题,0个赞分数为0,10个赞会掩盖全部评分(score默认在0-10)

使用modifier平滑votes的值,新的评分如下:

new_score = old_score * log(1 + number_of_votes)

带modifier的请求如下:

GET /blogposts/post/_search
{"query": {"function_score": {"query": {"multi_match": {"query":    "popularity","fields": [ "title", "content" ]}},"field_value_factor": {"field":    "votes","modifier": "log1p" }}}
}

修饰语 modifier 的值可以为: none (默认状态)、 log 、 log1p 、 log2p 、 ln 、 ln1p 、 ln2p 、 square 、 sqrt 以及 reciprocal 。想要了解更多信息请参照: field_value_factor 文档.

使用factor来调节效果:

最终votes和factor会相乘

GET /blogposts/post/_search
{"query": {"function_score": {"query": {"multi_match": {"query":    "popularity","fields": [ "title", "content" ]}},"field_value_factor": {"field":    "votes","modifier": "log1p","factor":   2 }}}
}

新的公式为:

new_score = old_score * log(1 + factor * number_of_votes)

factor 值大于 1 会提升效果, factor 值小于 1 会降低效果,如图 图 31 “受欢迎度的对数关系基于多个不同因子” 。

boostmode控制函数与查询评分 _score 合并后的结果

boostmode可以接受的参数

  • multiply

评分 _score 与函数值的积(默认)

  • sum

评分 _score 与函数值的和

  • min

评分 _score 与函数值间的较小值

  • max

评分 _score 与函数值间的较大值

  • replace

函数值替代评分 _score

GET /blogposts/post/_search
{"query": {"function_score": {"query": {"multi_match": {"query":    "popularity","fields": [ "title", "content" ]}},"field_value_factor": {"field":    "votes","modifier": "log1p","factor":   0.1},"boost_mode": "sum" }}
}

与使用乘积的方式相比,使用评分 _score 与函数值求和的方式可以弱化最终效果,特别是使用一个较小 factor 因子时

新的计算公式:

new_score = old_score + log(1 + 0.1 * number_of_votes)

max_boost 限制函数的最大效果

GET /blogposts/post/_search
{"query": {"function_score": {"query": {"multi_match": {"query":    "popularity","fields": [ "title", "content" ]}},"field_value_factor": {"field":    "votes","modifier": "log1p","factor":   0.1},"boost_mode": "sum","max_boost":  1.5 }}
}

注:

  • 无论 field_value_factor 函数的结果如何,最终结果都不会大于 1.5 。
  • max_boost 只对函数的结果进行限制,不会对最终评分 _score 产生直接影响。

过滤提升权重

我们都知道,过滤是不会影响评分的,但在function_score中可以设置weight来影响评分,他和boost都可以用于任何查询,唯一的区别是weight 没有被 Luence 归一化成难以理解的浮点数,而是直接被应用,而过滤,可以使用缓存

GET /_search
{"query": {"function_score": {"filter": { "term": { "city": "Barcelona" }},"functions": [ {"filter": { "term": { "features": "wifi" }}, "weight": 1},{"filter": { "term": { "features": "garden" }}, "weight": 1},{"filter": { "term": { "features": "pool" }}, "weight": 2 }],"score_mode": "sum", }}
}
  • function_score 查询有个 filter 过滤器而不是 query 查询。
  • functions 关键字存储着一个将被应用的函数列表。
  • 函数会被应用于和 filter 过滤器(可选的)匹配的文档。
  • pool 比其他特性更重要,所以它有更高 weight 。
  • score_mode 指定各个函数的值进行组合运算的方式。

过滤VS查询

首先要注意的是 filter 过滤器代替了 query 查询, 在本例中,我们无须使用全文搜索,只想找到 city 字段中包含 Barcelona 的所有文档,逻辑用过滤比用查询表达更清晰。过滤器返回的所有文档的评分 _score 的值为 1 。 function_score 查询接受 query 或 filter ,如果没有特别指定,则默认使用 match_all 查询。

函数Functions

functions 关键字保持着一个将要被使用的函数列表。 可以为列表里的每个函数都指定一个 filter 过滤器,在这种情况下,函数只会被应用到那些与过滤器匹配的文档,例子中,我们为与过滤器匹配的文档指定权重值 weight 为 1 (为与 pool 匹配的文档指定权重值为 2 )。

评分模式score_mode

  • multiply

函数结果求积(默认)。

  • sum

函数结果求和。

  • avg

函数结果的平均值。

  • max

函数结果的最大值。

  • min

函数结果的最小值。

  • first

使用首个函数(可以有过滤器,也可能没有)的结果作为最终结果

随机评分(consistently random scoring)

随机评分的重要作用是让具有相同分数的结果展示的次序是随机的而不是固定的,这能保证有相同评分的文档都能有均等相似的展现机率。并且,当用户翻页时,结果的相对次序能够保持一致,这种行为被称为一致随机(consistently random) 。
https://www.elastic.co/guide/cn/elasticsearch/guide/current/random-scoring.html

衰减函数的曲线-越近越好

重要且难以理解,主要运用于两个滑动标准,如地点和价格,之间权衡。

https://www.elastic.co/guide/cn/elasticsearch/guide/current/decay-functions.html

BM25相关度算法(非重要,进阶必备)

https://www.elastic.co/guide/cn/elasticsearch/guide/current/pluggable-similarites.html

Elastic Search 深入搜索相关推荐

  1. 如何使用 Elastic Search Low Level API 构造请求进行搜索

    场景: 需要在客户端构造请求调解, 调用 Elastic Search 的 API 取到结果,并且能够使用 ES 的授权机制. 方案: 一.在客户端构造 Low Level API . 二.Low L ...

  2. 集成Elastic Search实现文档的全文搜索功能实战

    技术选型 该领域已被Lucene独占,几乎无竞争对手. 但是直接使用Lucene非常复杂,因此出现了两个组件,一是solr,二是elastic search,elastic search流行度更高,但 ...

  3. elastic search搜索学习打分算法简单总结

    elastic search搜索学习打分算法简单总结 之前也在es官网走马观花的看了一些es搜索方面的内容,发现自己之前对es的打分规则理解的很浅,最近又从阿里的<elastic stack实战 ...

  4. Elastic Search 中文拼音搜索补全实战

    引言 搜索提示是搜索框一个比较基础的功能,他赋予了搜索框生命,提高了用户的搜索体验.本文通过仿写 boss 直聘首页职位公司搜索,来实现一个自己搜索提示功能. 需求分析 搜索提示的情况比较多,比如根据 ...

  5. Elastic Search入门:架构说明及Docker方式体验

    Elastic Search简称ES,是一款在搜索和日志检索领域极其成功的开源产品,当然ES背后的商业化公司也很成功.很多大的知名品牌,像是SAP.Booking.Ebay都在使用ES, 今天就来实际 ...

  6. Elastic Search 上市了,Slack上市了,我也要写个软件,走上人生巅峰

    "欣哥,Slack上市了,估值100多亿美金!"  张大胖看到了最新的新闻,两眼发亮. "是啊!" "去年ElasticSearch 上市,也达到了5 ...

  7. elastic search java_在 Java 应用程序中使用 Elasticsearch

    如果您使用过 Apache Lucene 或 Apache Solr,就会知道它们的使用体验非常有趣.尤其在您需要扩展基于 Lucene 或 Solr 的解决方案时,您就会了解 Elasticsear ...

  8. Java微服务篇4——Elastic search

    Java微服务篇4--Elastic search 1.Elastic search安装配置 Elastic search官方:https://www.elastic.co/cn/products/e ...

  9. elastic search与mysql的数据同步

    go-mysql-elasticsearch插件简介 go-mysql-elasticsearch是用于同步mysql数据到ES集群的一个开源工具,项目github地址: https://github ...

最新文章

  1. String 类中怎么出现此类问题?
  2. 2021年改造数据中心未来最需要的技能
  3. 【提权思路】绕过SecureRDP限制远程连接
  4. Android L Settings 简要分析
  5. jboss as安装配置_书评:JBoss AS 7:配置,部署和管理
  6. mysql报错 DuplicateKeyException分析与解决
  7. 阿里主管通知我试用期延期……
  8. 中考可以使用计算机吗,中考报志愿必须用电脑吗
  9. 使用java的java 命令,直接调用执行class文件
  10. C语言经典弱智问题解法整理
  11. android 7红米3,红米7 3+64也并没有想象中那么差,开箱+上手初体验
  12. 各个蒙版的作用与区别
  13. 图文结合带你搞懂InnoDB MVCC
  14. uniapp app微信授权登录
  15. 学术角度看区块链:数字广告行业的“他山之石”
  16. 《赵成的运维体系管理课》学习笔记(3)——云计算时代的运维实践
  17. 织梦网站在空间怎么转服务器,织梦网站换空间
  18. 区间概念让5千年都无人能识的无穷大自然数一下子暴露出来——数学一直被假自然数集(列)迷惑而将各假N误为N
  19. Selenium(API的基础)
  20. xpath定位标签、xpath选择范围,position

热门文章

  1. 智能信息检索课程设计
  2. 关于强类型语言和无(弱)类型语言——致编程入门者
  3. Base64 加密解密图片
  4. 【算法•日更•第十四期】信息奥赛一本通1592:【例 1】国王题解
  5. iop导出excel,简单例子。
  6. c语言遍历 json字符串,全面详解c语言使用cJSON解析JSON字符
  7. 常用自动门感应器工作原理
  8. Linux——基本指令
  9. JavaScript过滑块 模拟鼠标拖动(验证码)滑块
  10. MySQL中的级联删除与更新策略on delete restrict on update restrict