Lucene,ES全文检索

Lucene 全文检索核心包(适用中小型项目)

ES/Solr是对Lucene封装的检索工具(适用大型项目)

一、Lucene的核心原理

创建索引,搜索索引

步骤:(1):先从数据库或者文档中采集相关数据

        (2):创建相关的索引,建立索引库

        (3):用户查询的时候,就去搜索相关的索引

        (4):查出来后进行数据展示

如图所示:

二、创建索引的步骤 

        如图所示:

根据相关条件,形成倒排索引文档,如图所示: 

用户搜索索引的过程:

        (1):用户输入关键字

        (2):在倒排索引文档查询到相关词汇

        (3):根据后面的索引去数据区查询到数据
 

三、ES的文档CRUD操作

(1)添加文档

POST index/type/
{
    JSON,文档内容
}
--解释---------------------------------------
PUT 索引库/文档类型/
{
    JSON格式,文档原始数据
}
没有指定文档ID,ES会自动生成ID

举例:PUT crm/user/11    
{
    "id":11,
    "username":"zs",
    "age":18,
    "name":"zs",
    "sex":1,
    "join_date": 1584092062348
}

(2)获取文档
GET 索引库/类型/文档ID 

(3)修改文档

        整体修改:会把ES中的数据全部覆盖,即age字段会消失

PUT {index}/{type}/{id}
{
    "id":11,
    "username":"zs"
}

        局部修改:只会修改id,和username字段,age字段不会作任何改变

POST /crm/user/123/_update
{
    "doc":{
        "id" : 11, 
        "username": "xx"
    }
}

(4)删除文档

DELETE {index}/{type}/{id}

四、DSL查询和过滤

        什么是DSL查询?DSL查询是由ES提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询

        举例:

GET /crm/user/_search
{
    "query" : {
           "match" : {
               "username" : "Hello Java"
        }
    }
}

match如同:where username = hello or username = java

term如同:where username = "Hello Java

  • query : 查询,所有的查询条件在query里面

  • bool : 组合搜索bool可以组合多个查询条件为一个查询对象,这里包含了 DSL查询和DSL过滤的条件

  • must : 必须匹配 :与(must) 或(should) 非(must_not)

  • match:分词匹配查询,会对查询条件分词 , multi_match :多字段匹配

  • filter: 过滤条件

  • term:词元查询,不会对查询条件分词

  • from,size :分页

  • _source :查询结果中需要哪些列

  • sort:排序

(1) DSL过滤

需要模糊查询的使用DSL查询 ,需要精确查询的使用DSL过滤,在开发中组合使用(组合查询) ,关键字查询使用DSL查询,其他的都是用DSL过滤。

(2)查询方式

        1.全匹配       

        GET _search
{
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {}
        }
      ],
      "filter": {
        "term": {
          "name": "zs1"
        }
      }

        2.标准查询

     match:  match一般只用于全文字段的匹配与查询,一般不用于过滤。

 {
    "query": {
        "match": {
            "fullName": "Steven King"        
        }
    }
}

multi_match 查询允许你做 match查询的基础上同时搜索多个字段

{
    "query": {

        "multi_match": {

            "query": "Steven King",

            "fields": ["fullName", "title"]

        }
    }
}

term:理解为等值查询,字符串,数字等都可以使用它,把查询的内容看成一个整体去检索ES库

"filter": {
                "term": {
                    "username": "Steven King"
                }
            }

range:过滤允许我们按照指定范围查找一批数据

"range": {
            "age": {
                "gte": 20,
                "lt": 30
            }

上例中查询年龄大于等于20并且小于30。

prefix:和term查询相似,前匹配搜索不是精确匹配,而是类似于SQL中的like ‘key%
"query": {
        "prefix": {
            "fullName": "王"
        }
    }

wildcard:通配符搜索

"query": {
        "wildcard": {
            "fullName": "倪*华"
        }
    }


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部