1. 分词查问操作

创立索引:

PUT /movies/_doc/1{  "name":"The film, filmed in 2021 & tells the story of children"}

按分词搜寻:

GET /movies/_search{  "query": {    "match": {"name": "story"}  }}

通过单个词,能够搜寻匹配到后果, 采纳analyze查看分词信息:

GET /movies/_analyze {  "field": "name",  "text": "The film, filmed in 2021 & tells the story of children"}

analyze分词解决流程:

分词器的应用:

如果搜寻关键词为tell是没有任何后果, 这个时候须要采纳英文分词器。

#从新创立索引PUT /movies{  "settings":{      "index":{        "number_of_shards": 1,         "number_of_replicas": 0      }    },  "mappings": {    "properties": {      "name":{"type":"text", "analyzer": "english"}    }  }}

从新插入数据, 采纳关键词tell搜寻, 能够找到对应的后果:

"hits" : {    "total" : {      "value" : 1,      "relation" : "eq"    },    "max_score" : 0.2876821,    "hits" : [      {        "_index" : "movies",        "_type" : "_doc",        "_id" : "1",        "_score" : 0.2876821,        "_source" : {          "name" : "The film, filmed in 2021 & tells the story of children"        }      }    ]  }

通过英文分词器, 会进行词干转化。比方一个单词tells,理论词干为tell, 都能够进行搜寻匹配。

2. 配置TMDB开源电影数据

TMDB是开源的电影网站数据, 外面累积数据较多,比拟规范化,便于ES的钻研和学习。

  1. 下载tmdb数据

    下载地址

  2. 导入工程

    ESConfig的连贯配置类:

    @Bean    public TransportClient getClient(){        TransportClient transportClient = null;        try {            Settings settings = Settings.builder().build();            transportClient = new PreBuiltTransportClient(settings);            // ES的连贯配置信息, 默认transport传输端口为9300,不是9200            TransportAddress firstAddress = new TransportAddress(InetAddress.getByName("10.10.20.28"),Integer.parseInt("9300"));            transportClient.addTransportAddress(firstAddress);        }catch (Exception e){            e.printStackTrace();        }        return transportClient;    }

    ESController提供导入接口:

    @RequestMapping("/importdata")@ResponseBodypublic ResponseEntity importdata() throws IOException {    ...    // 索引构造配置信息, 索引名称要配置正确    bulkRequest.add(new IndexRequest("movies", "_doc", String.valueOf(lineId-1)).source(XContentType.JSON,                        "title", records[17],                        "tagline",records[16],                        "release_date",date,                        "popularity",records[8],                        "cast",cast,                        "overview",records[7]));    ...}
  3. 通过kibana创立索引构造

    PUT /movies{    "settings": {        "number_of_shards": 1,        "number_of_replicas": 0    },    "mappings": {        "properties": {            "title": {                "type": "text",                "analyzer": "english"            },            "tagline": {                "type": "text",                "analyzer": "english"            },            "release_date": {                "type": "date",                "format": "8yyyy/MM/dd||yyyy/M/dd||yyyy/MM/d||yyyy/M/d"            },            "popularity": {                "type": "double"            },            "cast": {                "type": "object",                "properties": {                    "character": {                        "type": "text",                        "analyzer": "standard"                    },                    "name": {                        "type": "text",                        "analyzer": "standard"                    }                }            },            "overview": {                "type": "text",                "analyzer": "english"            }        }    }}
  4. 导入数据

    调用接口: http://127.0.0.1:8080/es/importdata

    会读取csv文件, 主动导入数据。

  5. 查看导入后果

    通过kibana后盾,查看导入的数据:

  6. 搜寻查问

    搜寻title为heart的关键字

    GET /movies/_search{    "query":{        "match":{"title":"heart"}     }}

    可能依据english分词器进行搜寻匹配返回所有相干的后果, 每个后果都会有对应的_score评分,关键字呈现频率越高, 或占比越高, 则得分越高,优先排在后面。

3. 搜寻匹配进阶

  1. or匹配

    GET /movies/_search{    "query": {        "match": {            "title": "heart from"        }    }}

    match搜寻本质上就是or关系, 分为heart 和from两个关键词进行or关系搜寻。

  2. or的最小词匹配管制

    GET /movies/_search{  "query":{    "match":{      "title": {        "query": "good hearts sea",        "operator": "or",        "minimum_should_match": 2      }          }  }}

    这里minimum_should_match设定为2, 只有呈现good hearts 和 hearts sea,都会展现进去。

  3. and匹配

    GET /movies/_search{  "query":{    "match":{      "title": {        "query": "heart sea",        "operator": "and"      }         }  }}

    通过operator属性来标识对应的操作。这个时候搜寻进去的title会蕴含heart和sea两个关键字。

  4. 短语查问

    如果想间接搜寻某个短语, 比方:The Good Heart, 能够采纳match_phrase

    GET /movies/_search{  "query":{    "match_phrase":{"title":"The Good Heart"}  }}

    会做整个短语的残缺匹配, 不会再进行拆分匹配。

  5. 多字段查问

    如果想对多个字段同时查问, 能够采纳multi_match形式。

    GET /movies/_search{  "query":{    "multi_match":{      "query": "good hearts sea",      "fields": ["title", "overview"]    }  }}

    查问title和overview两个属性, 都蕴含“good hearts sea”的记录, 相比一个属性title的查问, 多出更多的记录。

4. Query String查问

能够采纳更简便的形式,间接应用AND、OR和NOT操作。

GET /movie/_search{  "query":{    "query_string":{      "fields":["title"],      "query":"heart AND sea"          }  }}

查出title当中既蕴含heart又蕴含sea的数据。

GET /movie/_search{  "query":{    "query_string":{      "fields":["title"],      "query":"heart OR sea"          }  }}

查出title当中蕴含heart或sea的数据。

GET /movie/_search{  "query":{    "query_string":{      "fields":["title"],      "query":"heart NOT sea"          }  }}

查出title当中蕴含heart但不蕴含sea的数据。

本文由mirson创作分享, 感激大家的反对, 心愿对大家有所播种!
入群申请,请加WX号:woodblock99