一般情况下es会自动进行查询重写的操作,比如es自动将布尔查询更改为过滤器查询以提高查询速率,当然我们可以调用rewrite api进行合理的查询改写。
1.1 rewrite api可配置的的详细参数
-
constant_score_boolean
为每个文档分配与参数相等的相关性分数。此方法将原始查询更改为布尔查询。此查询包含每个匹配字词的子句和字词查询。此方法可能会导致最终查询超出 indices.query.bool.max_clause_count 设置中的子句限制。如果查询超过此限制,Elasticsearch 将返回错误。
-
scoring_boolean
计算每个匹配文档的相关性分数。此方法将原始查询更改为布尔查询。此查询包含每个匹配字词的子句和字词查询。此方法可能会导致最终查询超出 indices.query.bool.max_clause_count 设置中的子句限制。如果查询超过此限制,Elasticsearch 将返回错误。
-
top_terms_blended_freqs_N
计算每个匹配文档的相关性分数,就好像所有术语都具有相同的频率。此频率是所有匹配项的最大频率。此方法将原始查询更改为布尔查询。此查询包含每个匹配字词的子句和字词查询。最终查询仅包括最高分的查询项。可以使用此方法避免超出 indices.query.bool.max_clause_count 设置中的子句限制。
-
top_terms_boost_N
为每个匹配的文档分配与参数相等的相关性分数。此方法将原始查询更改为布尔查询。此查询包含每个匹配字词的子句和字词查询。最终查询仅包括对热门字词的查询。可以使用此方法避免超出 indices.query.bool.max_clause_count 设置中的子句限制。
-
top_terms_N
计算每个匹配文档的相关性分数。此方法将原始查询更改为布尔查询。此查询包含每个匹配字词的子句和字词查询。最终查询 仅包括对得分最高的字词的查询。可以使用此方法避免超出 indices.query.bool.max_clause_count 设置中的子句限制。
1.2 可配置查询改写的查询方法
-
fuzzy(纠错查询)
-
prefix(前置查询)
-
query_string
-
regexp(正则查询)
-
wildcard(通配符查询)
note: 之所以可以在以上的查询中调用查询改写,是因为es本身是基于Lucene,而Lucene原始形态并不支持以上这些查询,为实现这些查询,将这些查询改写为更为简单的形态,例如布尔查询等方法,其中保留的方法就是rewrite。
1.3 rewrite参数确定了什么
-
Lucene:如何计算每个匹配文档的相关性分数
-
Lucene:是否将原始查询更改为查询或位集bool
-
如果更改为查询,则包含哪些查询子句bool term
1.4 改写的一般规则
一般来说:如果你能接受低精度(高性能),那么可以采用top N查询改写方法。如果你需要更高的查询精度(低性能),那么应该使用布尔方法。
举例:
GET test/_search
{
"query": {
"wildcard": {
"name": {
"value": "w*",
"rewrite": "top_terms_boost_10"
}
}
}
}
es的排序主要是调用sort参数,并不是所有的数据类型都可以排序,可排序类型:
-
日期
-
数字
2.1 降序排序(desc)
例子:
GET test/_search
{
"query": {
"match": {
"name": "wangyang"
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
2.2 升序排序(asc)
例子:
GET test/_search
{
"query": {
"match": {
"name": "wangyang"
}
},
"sort": [
{
"age": {
"order": "asc"
}
}
]
}
总 结:
对于搜索引擎来说,拥有较快的查询速度、较高的准确率等基础能力已经实属不易,而ES优秀的地方在于它较之于其他搜索引擎更具有查询的灵活性。
当然,灵活的代价就是有大量的奇巧需要练习;有大量的知识需要融汇贯通。希望可以通过阅读本文已经让您大体了解基础的ES搜索方法。
发表评论