Elasticsearch笔记(9)

339 阅读2分钟

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

备注:继Elasticsearch笔记(8)

过滤器

对搜索出来的结果进行数据过滤。不会到es库里去搜,不会去计算文档的相关度分数,所以过滤的性能会比较高,过滤器可以和全文搜索结合在一起使用。 post_filter元素是一个顶层元素,只会对搜索结果进行过滤。不会计算数据的匹配度相关性分数,不会根据分数去排序,query则相反,会计算分数,也会按照分数去排序。 使用场景:

  • query:根据用户搜索条件检索匹配记录
  • post_filter:用于查询后,对结果数据的筛选

实操:查询账户金额大于80元,小于160元的用户。并且生日在1998-07-14的用户

  • gte:大于等于

  • lte:小于等于

  • gt:大于

  • lt:小于 (除此以外还能做其他的match等操作也行)

#POST     /{index}/_doc/_search
​
{
    "query": {
        "match": {
            "comefrom": "河北"
        }   
    },
​
    "post_filter": {
        "range": {
            "age": {
                "gt": 20,
                "lt": 25
            }
        }
    }   
}
#查询结果:河北的一共有两个人 通过post_filter过滤了年龄
{
    "took": 22,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.2876821,
        "hits": [
            {
                "_index": "jacuesh",
                "_type": "_doc",
                "_id": "1002\n",
                "_score": 0.2876821,
                "_source": {
                    "id": 1002,
                    "age": 21,
                    "username": "刘慧鹏",
                    "nickname": "鹏鹏",
                    "comefrom": "河北省邯郸市",
                    "sex": 1,
                    "birthday": "1998-10-21",
                    "class": "计算机科学以技术1班"
                }
            }
        ]
    }
}
​

image-20200905024655571.png

排序

es的排序同sql,可以desc也可以asc。也支持组合排序。

实操:

# POST     /{index}/_doc/_search
{
    "query": {
        "match": {
            "comefrom": "河北"
        }
    },
    "post_filter": {
        "range": {
            "age": {
                "gt": 20,
                "lt": 25
            }
        }
    },
    "sort": [
        {
            "age": "desc"
        },
        {
            "birthday": "desc"
        }
    ]
}
​
##################注意##################
  文本类型如果需要排序 得指定里面的keyword
​
{
    "sort": [
        {
            "nickname.keyword": "asc"
        }
    ]
}
​
高亮显示
#POST     /{index}/_doc/_search
{
    "query": {
        "match": {
            "comefrom": "河北"
        }
    },
    "highlight": {
        "pre_tags": ["<tag>"],
        "post_tags": ["</tag>"],
        "fields": {
            "comefrom": {}
        }
    }
}
拓展 - prefix-fuzzy-wildcard
prefix(前缀查询)

根据前缀去查询

POST     /{index}/_doc/_search
{
    "query": {
        "prefix": {
            "desc": "imo"
        }
    }
}
​
fuzzy(模糊搜索)

模糊搜索,并不是指的sql的模糊搜索,而是用户在进行搜索的时候的打字错误现象,搜索引擎会自动纠正,然后尝试匹配索引库中的数据。

# POST     /{index}/_doc/_search
{
  "query": {
    "fuzzy": {
      "desc": "imoov.coom"
    }
  }
}
# 或多字段搜索
{
  "query": {
    "multi_match": {
      "fields": [ "desc", "nickname"],
      "query": "imcoc supor",
      "fuzziness": "AUTO"
    }
  }
}
​
{
  "query": {
    "multi_match": {
      "fields": [ "desc", "nickname"],
      "query": "演说",
      "fuzziness": "1"
    }
  }
}
wildcard(占位符查询)

占位符查询。

  • ?:1个字符

  • *:1个或多个字符

    #POST     /{index}/_doc/_search
    {
      "query": {
        "wildcard": {
          "desc": "*oo?"
        }
      }
    }
    {
        "query": {
            "wildcard": {
                "desc": "演*"
            }
        }
    }