使用query关键字进行检索,倾向于相关度搜索,故需要计算评分。搜索是ES最关键和重要的部分。
概念:相关度评分用于对搜索结果排序,评分越高则认为其结果和搜索的预期值相关度越高,即越符号预期值。在7.x之前相关度评分默认使用TF/IDF算法计算而来,7.x之后默认使用BM25。
排序:相关度评分为搜索结果的排序依据,默认情况下评分越高,则结果越靠前。
PUT product
{
"mappings": {
"_source": {
"includes": [
"name",
"price"
],
"excludes": [
"desc",
"tags"
]
}
}
}
GET /product/_search
GET /product/_search?q=name:xiaomi
- GET /product/_search?from=0&size=2&sort=price:asc
GET /product/_search?q=date:2021-06-01
GET /product/_search?q=2021-06-01
语法:
GET index/_search
{
"query": {
***
}
}
下面示例中"xiaomi nfc phone" 会被拆分成3个词项,满足任何一个词项的doc,都会被搜索出来。
GET /product/_search
{
"query": {
"match": {
"name": "xiaomi nfc phone"
}
}
}
GET /product/_search
{
"query": {
"match_all": {}
}
}
在多个字段中查询,一个字段中包含查询条件就搜索出,match只是在一个字段中查询。
GET /product/_search
{
"query": {
"multi_match": {
"query": "phone",
"fields": ["name", "desc"]
}
}
}
查询的字段中必须包含该短语。
GET /product/_search
{
"query": {
"match_phrase": {
"name": "xiaomi nfc"
}
}
}
也就是搜索的字段中必须包含指定的词项,且term指定的就是完整的词项,不会向match那样进行拆分。
GET /product/_search
{
"query": {
"term": {
"name": {
"value": "nfc"
}
}
}
}
GET /product/_search
{
"query": {
"term": {
"name.keyword": {
"value": "xiaomi nfc phone"
}
}
}
}
term是搜索字段包含其中的词项即可,terms是指搜索字段中只要包含其中的一个词项即可,也就是terms中可以包含多个词项。
GET /product/_search
{
"query": {
"terms": {
"name": [
"phone",
"xiaomi"
]
}
}
}
GET /product/_search
{
"query": {
"range": {
"price": {
"gte": 1000,
"lte": 50000
}
}
}
}
filter查询的性能比query要高,主要原因是filter查询对结果不在进行评分,减少了评分所消耗的时间。
示例如下:
// 给定具体的评分,不给定默认是1分
GET /product/_search
{
"query": {
"constant_score": {
"filter": {
"match": {
"name": "huawei"
}
}
"boost":1
}
}
}
// 放在组合查询中
GET /product/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"name": "huawei"
}
}
]
}
}
}
filter是结果导向的,速度更快,而query是过程导向的。
query倾向于“当前文档和查询的语句的相关度”,而filter倾向于“当前文档和查询到条件是不是相符”。即在查询过程中,query是要对查询的每个结果计算相关性得分的,而filter不会。另外filter有相应的缓存机制,可以提高查询效率。
bool:可以组合多个查询条件,bool查询也是采用more_matches_is_better的机制,bool组合的条件之间通过and结合起来。
因此满足must和should子句的文档会合并起来计算分值。
GET /product/_search
{
"query": {
"bool": {
"filter": [
{
"match":{
"name": "phone"
}
}
],
"should": [
{
"match_phrase": {
"name": "xiaomi phone"
}
}
],
"minimum_should_match": 1
}
}
}