企业网站的建设与应用开题报告,可以做网站首页的图片,郑州微信小程序开发公司排名,潍坊网站建设方案外包1 DSL查询文档
elasticsearch的查询依然是基于JSON风格的DSL来实现的。
1.1.DSL查询分类
Elasticsearch提供了基于JSON的DSL#xff08;Domain Specific Language#xff09;来定义查询。常见的查询类型包括#xff1a; 查询所有#xff1a;查询出所有数据#xff0c;一…1 DSL查询文档
elasticsearch的查询依然是基于JSON风格的DSL来实现的。
1.1.DSL查询分类
Elasticsearch提供了基于JSON的DSLDomain Specific Language来定义查询。常见的查询类型包括 查询所有查询出所有数据一般测试用。例如match_all 全文检索full text查询利用分词器对用户输入内容分词然后去倒排索引库中匹配。例如 match_querymulti_match_query 精确查询根据精确词条值查找数据一般是查找keyword、数值、日期、boolean等类型字段。例如 idsrangeterm 地理geo查询根据经纬度查询。例如 geo_distancegeo_bounding_box 复合compound查询复合查询可以将上述各种查询条件组合起来合并查询条件。例如 boolfunction_score
查询的语法基本一致
GET /indexName/_search
{query: {查询类型: {查询条件: 条件值}}
}例如查询所有
查询类型为match_all没有查询条件
// 查询所有
GET /indexName/_search
{query: {match_all: {}}
}2.全文搜索查询
2.1.使用场景
全文检索查询的基本流程如下
对用户搜索的内容做分词得到词条根据词条去倒排索引库中匹配得到文档id根据文档id找到文档返回给用户
比较常用的场景包括
商城的输入框搜索百度输入框搜索
2.2 match和mulit_match查询
match查询是全文检索查询的一种,会对用户输入内容进行分词,然后进行倒排索引库检索.(单字段查询)
match查询单字段查询multi_match查询多字段查询任意一个字段符合条件就算符合查询条件
match查询语法如下
GET /indexName/_search
{query: {match: {FIELD: TEXT}}
}mulit_match语法如下
GET /indexName/_search
{query: {multi_match: {query: TEXT,fields: [FIELD1, FIELD12]}}
}# 示例
GET /hotel/_search
{query: {match: {all: 西直门如家}}
}GET /hotel/_search
{query: {multi_match: {query: 外滩如家,fields: [brand,name]}}
}因为我们将brand、name、business值都利用copy_to复制到了all字段中。因此你根据三个字段搜索和根据all字段搜索效果当然一样了。
但是搜索字段越多对查询性能影响越大因此建议采用copy_to然后单字段查询的方式。
match和multi_match的区别是什么
match根据一个字段查询multi_match根据多个字段查询参与查询字段越多查询性能越差
3.精确查询
精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词。常见的有
term根据词条精确值查询range根据值的范围查询
利用term进行精确查询,精确查询city值为上海的酒店.
# term查询
GET /hotel/_search
{query: {term: {city: {value: 上海}}}
}利用range进行范围查询查询,查询price在100-300之间的酒店,其中gte表示大于等于,lte表示小于等于(另外还有gt和lt分别表示大于和小于).
# range查询
GET /hotel/_search
{query: {range: {price: {gte: 100,lte: 300}}}
}4.地理查询
根据经纬度查询.
4.1矩形范围查询
geo_bounding_box:查询geo_point落在某个矩形范围的所有文档.
// geo_bounding_box查询
GET /indexName/_search
{query: {geo_bounding_box: {FIELD: {top_left: { // 左上点lat: 31.1,lon: 121.5},bottom_right: { // 右下点lat: 30.9,lon: 121.7}}}}
}4.2附近查询
geo_distance:查询指定中心点小于某个距离值的所有文档.
// geo_distance 查询
GET /indexName/_search
{query: {geo_distance: {distance: 15km, // 半径FIELD: 31.21,121.5 // 圆心}}
}5.相关算法
复合compound查询复合查询可以将其它简单查询组合起来实现更复杂的搜索逻辑。常见的有两种
fuction score算分函数查询可以控制文档相关性算分控制文档排名bool query布尔查询利用逻辑关系组合多个其它的查询实现复杂搜索
利用match查询时文档结果会根据与搜索词条的关联度打分_score返回结果时按照分值降序排列。在elasticsearch中早期使用的打分算法是TF-IDF算法公式如下
在后来的5.1版本升级中elasticsearch将算法改进为BM25算法公式如下 TF-IDF算法有一各缺陷就是词条频率越高文档得分也会越高单个词条对文档影响较大。而BM25则会让单个词条的算分有一个上限曲线更加平滑 5 Funciton score query
通过Funciton score query可以修改文档的相关性算分(query score),根据新的到的算分进行排序.
function score 查询中包含四部分内容
原始查询条件query部分基于这个条件搜索文档并且基于BM25算法给文档打分原始算分query score)过滤条件filter部分符合该条件的文档才会重新算分算分函数符合filter条件的文档要根据这个函数做运算得到的函数算分function score有四种函数 weight函数结果是常量field_value_factor以文档中的某个字段值作为函数结果random_score以随机数作为函数结果script_score自定义算分函数算法 运算模式算分函数的结果、原始查询的相关性算分两者之间的运算方式包括 multiply相乘replace用function score替换query score其它例如sum、avg、max、min
正常查询在外滩的酒店
GET /hotel/_search
{query: {function_score: {query: {match: {all: 外滩}}}}
}给如家的酒店进行分数的加权,每个加十分.
GET /hotel/_search
{query: {function_score: {query: {match: {all: 外滩}},functions: [{filter: {term: {brand: 如家}},weight: 10}],boost_mode: sum}}
}6 Boolean Query
布尔查询是一个或多个查询子句的组合.组合方式有:
must必须匹配每个子查询类似“与”should选择性匹配子查询类似“或”must_not必须不匹配不参与算分类似“非”filter必须匹配不参与算分 查找上海的酒店 从皇宫假日和如家上选取 价格不低于500 评分高于45 GET /hotel/_search
{query: {bool: {must: [{term: {city:上海}}],should: [{term: {brand:皇宫假日}},{term: {brand:如家}}],must_not: [{range: {price:{lte: 500}}}],filter: [{range: {score:{gte: 45}}}]}}
}
需求搜索名字包含“如家”价格不高于400在坐标31.21,121.5周围10km范围内的酒店。
分析
名称搜索属于全文检索查询应该参与算分。放到must中价格不高于400用range查询属于过滤条件不参与算分。放到must_not中周围10km范围内用geo_distance查询属于过滤条件不参与算分。放到filter中
GET /hotel/_search
{query: {bool: {must: [{term: {brand:如家}}],must_not: [{range: {price:{gte: 400}}}],filter: [{geo_distance: {distance: 10km, location: 31.21,121.5 }}]}}
}