本文讲到的是一些简单的es搜索:
1.es的精确值查询,参考文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/_finding_exact_values.html
1.term用来处理数字(numbers)、布尔值(Booleans)、日期(dates)以及文本(text)
2.简单的查询价格,参数:constant_score 是用来设置查询以非评分方式执行
{
"query" : {
"constant_score" : {
"filter" : {
"term" : {
"price" : 20
}
}
}
}
}
2.组合过滤器 参考文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/combining-filters.html
1.must 所有的语句都 必须(must) 匹配,与 AND 等价。
2. must not 所有的语句都 不能(must not) 匹配,与 NOT 等价。
3. should 至少有一个语句要匹配,与 OR 等价。
3.查询多个精确值
我们只需要在term 后面加上s terms就可以
4.范围 (https://www.elastic.co/guide/cn/elasticsearch/guide/current/_ranges.html)
between and == range
在es中我们可以使用range
eg:
{
"query" : {
"constant_score" : {
"filter" : {
"range" : {
"price" : {
"gte" : 20,
"lt" : 40
}
}
}
}
}
}
gt: > 大于(greater than)
lt: < 小于(less than)
gte: >= 大于或等于(greater than or equal to)
lte: <= 小于或等于(less than or equal to)
5.es缓存
Elasticsearch 会基于使用频次自动缓存查询。如果一个非评分查询在最近的 256 次查询中被使用过(次数取决于查询类型),那么这个查询就会作为缓存的候选。但是,并不是所有的片段都能保证缓存 bitset 。只有那些文档数量超过 10,000 (或超过总文档数量的 3% )才会缓存 bitset 。因为小的片段可以很快的进行搜索和合并,这里缓存的意义不大。
一旦缓存了,非评分计算的 bitset 会一直驻留在缓存中直到它被剔除。剔除规则是基于 LRU 的:一旦缓存满了,最近最少使用的过滤器会被剔除。
6.关于es多字段搜索导致结果不准确,一些特别不重要的结果放在结果集前面我们可以设置比例来筛选结果集(minimum_should_match);
"query" => [
'multi_match' => [
'query' => $keyword,
'fields' => ['title^5', 'teacherDesc^2', 'brief^1'],
'minimum_should_match' => '90%',
]
],
7.配置ik词库
我们可以自定义我们自己的词库 参考文章:https://github.com/medcl/elasticsearch-analysis-ik
本人遇到的问题是配置了本地词库以后搜索词库配置的词结果为空,后面发现需要在配置后插入的数据才有效