Elasticsearch-Kibana使用教程

2023-12-05

1.索引操作

1.1创建索引

PUT /employee
{
    "settings": {
        "index": {
            "refresh_interval": "1s",
            "number_of_shards": 1,
            "max_result_window": "10000",
            "number_of_replicas": 0
        }
    },
    "mappings": {
        "properties": {
            "id": {
                "type": "long"
            },
            "name": {
                "type": "keyword"
            },
            "age": {
                "type": "integer"
            },
            "create_date": {
                "type": "date",
                    "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
            },
            "address": {
                "type": "keyword"
            },
            "desc": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            },
            "leader": {
                "type": "object"
            },
            "car": {
                "type": "nested",
                "properties": {
                    "brand": {
                        "type": "keyword",
                        "ignore_above": 256
                    },
                    "number": {
                        "type": "keyword",
                        "ignore_above": 256
                    },
                    
                    "make": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            }
        }
    }
}       

1.2删除索引

DELETE /employee

1.3添加字段

PUT /employee/_mapping
{
  "properties":{
    "salary":{
      "type":"double"
    }
  }
}

1.4查看表结构

GET /employee/_mapping

{
"employee" : {
"mappings" : {
"properties" : {
"address" : {
"type" : "keyword"
},
"age" : {
"type" : "integer"
},
"car" : {
"type" : "nested",
"properties" : {
"brand" : {
"type" : "keyword",
"ignore_above" : 256
},
"make" : {
"type" : "keyword",
"ignore_above" : 256
},
"number" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"create_date" : {
"type" : "date",
"format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"desc" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"id" : {
"type" : "long"
},
"leader" : {
"type" : "object"
},
"name" : {
"type" : "keyword"
},
"salary" : {
"type" : "double"
}
}
}
}
}

2.文档数据CRUD操作

2.1添加文档

PUT /employee/_doc/1
{
	"id": 1,
	"name": "张小勇",
	"age": "45",
	"leader": {
		"name": "马某",
		"age": 40,
		"depart": "营销部"
	},
	"car": [{
			"brand": "丰田",
			"make": "日本",
			"number": "粤A12345"
		},
		{
			"brand": "奔驰",
			"make": "德国",
			"number": "粤A9999"
		}
	],
	"address": "浙江杭州西湖阿里马巴巴高薪技术开发区110号",
	"desc": "长相不丑,擅长营销...."
}
PUT /employee/_doc/2
{
	"id": 2,
	"name": "张某龙",
	"age": "40",
	"leader": {
		"name": "马x腾",
		"age": 40,
		"depart": "研发部"
	},
	"car": [{
			"brand": "奔驰",
			"make": "中国北京",
			"number": "粤A8888"
		},
		{
			"brand": "华晨宝马",
			"make": "中国",
			"number": "粤A9999"
		}

	],
	"address": "广东省深圳市南山区某讯大厦1号",
	"desc": "长相帅气,高大威猛,人中龙凤,擅长写代码"
}

2.2修改文档

2.2.1PUT覆式修改

PUT /employee/_doc/1
{
    "id": 1,
    "address": "浙江杭州西湖阿里马巴巴高薪技术开发区111号"    
}

2.2.1POST覆盖式和非覆盖修改均支持

覆盖式修改,本质同上,相当于先删除后增加

POST /employee/_doc/1
{
    "id": 1,
    "address": "浙江杭州西湖阿里马巴巴高薪技术开发区112号"    
}

非覆盖式修改,只修改当前字段,其他字段和值保留原样

POST /employee/_update/1
{
    "doc": {
        "id": 1,
        "address": "浙江杭州西湖阿里马巴巴高薪技术开发区110号"
    }
}

2.3查询文档

Query string语法:
q=field:search content语法,默认是_all
+:代表一定要出现,类似must。
-:代表一定不能包含,类似must_not

GET /employee/_search
GET /employee/_search?q=id:1
GET /employee/_search?q=+id:1
GET /employee/_search?q=-id:1
GET /employee/_search?q=-id:1&q=name:赵老哥&sort=id:desc
GET /employee/_search?from=0&size=2

Query DSL写法:略

2.4删除文档

DELETE /employee/_doc/1

2.分词与分词器

2.1测试分词器

Elasticsearch默认的分词器是标准分词器,即对英文进行单词切割,对中文进行单字切割。

POST /_analyze
{
    "analyzer": "standard",
     "text": "我是一个中国人"
}

上述分词将分词为:我|是|中|国|人,即单字拆分。

3.文档搜索Query DSL语法

3.1sourcce指定输出字段

GET /employee/_search
{
  "_source": ["id","name","leader.name","car.*"], 
  "query": {
    "match_all": {}
  }
}

3.2match查询查询语法

3.2.1match_all查询

不带条件,全部查询

GET /employee/_search
{
  "query": {
    "match_all": {}
  }
}

3.2.2match查询

match查询text类型字段
match会被分词,查询text类型的数据,只要match的分词结果和text的分词结果有相同的就匹配

GET /employee/_search
{
  "_source": ["id","name","desc"], 
  "query": {
    "match": {
      "desc": "长相帅气"
    }
  }
}

查询结果为:
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.5948997,
"hits" : [
{
"_index" : "employee",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.5948997,
"_source" : {
"name" : "张某龙",
"id" : 2,
"desc" : "长相帅气,高大威猛,人中龙凤,擅长写代码"
}
},
{
"_index" : "employee",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.49274418,
"_source" : {
"name" : "张小勇",
"id" : 1,
"desc" : "长相不丑,擅长营销...."
}
}
]
}
}

match查询keyword类型字段
match会被分词,而keyword类型不会被分词,match的需要跟keyword的完全匹配才有结果

GET /employee/_search
{
  "_source": ["id","name"], 
  "query": {
    "match": {
      "name": "张小勇"
    }
  }
}

查询结果为:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.6931471,
"hits" : [
{
"_index" : "employee",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.6931471,
"_source" : {
"name" : "张小勇",
"id" : 1
}
}
]
}
}

3.2.3match_phrase查询

查询text类型字段,查询用于完整匹配指定短语,按照短语分词顺序匹配

GET /employee/_search
{
  "_source": ["id","name","desc"], 
  "query": {
    "match_phrase": {
      "desc": "长相帅"
    }
  }
}

查询结果为:
{
"took" : 17,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.9220042,
"hits" : [
{
"_index" : "employee",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.9220042,
"_source" : {
"name" : "张某龙",
"id" : 2,
"desc" : "长相帅气,高大威猛,人中龙凤,擅长写代码"
}
}
]
}
}

查询keyword类型字段,需要完全匹配,原因是keyword类型字段不分词,要完全匹配

GET /employee/_search
{
  "_source": ["id","name","desc"], 
  "query": {
    "match_phrase": {
      "address": "深圳市"
    }
  }
}

地址里面虽然有广州,但是查询无结果:

{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 0,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
}
}

3.3fuzzy模糊查询

搜索本身很多时候是不精确的,很多时候我们需要在用户的查询词中有部分错误的情况下也能召回正确的结果,可以理解为模糊匹配

经典莱文斯坦距离(Levenshtein distance) :编辑距离的一种,指两个字符串之间,由一个转成另一个所需的最少编辑操作次数

替换一个字符:dog -> do p
插入一个字符:an   -> an t
删除一个字符:you r -> you

莱文斯坦扩展版(Damerau–Levenshtein distance) :莱文斯坦距离的一个扩展版 ,将相邻位置的两个字符的互换当做一次编辑,而在经典的莱文斯坦距离计算中位置互换是2次编辑

参数说明:
fuzziness :代表固定的最大编辑距离,可以是数字0,1,2,默认是0,不开启错误匹配,或者字符串AUTO模式,自动根据字符长度来匹配编辑距离数
prefix_length :控制两个字符串匹配的最小相同的前缀大小,也即是前n个字符不允许编辑,必须与查询词相同,默认是0
max_expansions :匹配最大词项,取每个分片的N个词项,减少召回率,默认值为50
transpositions :将相邻位置字符互换算作一次编辑距离,如 ab -> ba,即使用Damerau–Levenshtein距离算法,默认开启,设置 transpositions=false将使用经典莱文斯坦距离算法

GET /employee/_search
{
  "query": {
    "fuzzy": {
      "desc": {
        "value": "长相",
        "fuzziness": 1,
        "prefix_length": 0,
        "max_expansions": 50,
        "transpositions": true
      }
    }
  }
}

上述查询无结果,是因为fuzzy不会对query分词,标准分词器分词为单字分词
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 0,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
}
}


如果设置编辑距离fuzziness为1,即最大允许分词是错一个字,即:

GET /employee/_search
{
  "query": {
    "fuzzy": {
      "desc": {
        "value": "长相",
        "fuzziness": 1,
        "prefix_length": 0,
        "max_expansions": 50,
        "transpositions": true
      }
    }
  }
}

查询结果变为:

{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 0.0,
"hits" : [
{
"_index" : "employee",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.0,
"_source" : {
"id" : 2,
"name" : "张某龙",
"age" : "40",
"leader" : {
"name" : "马x腾",
"age" : 40,
"depart" : "研发部"
},
"car" : [
{
"brand" : "奔驰",
"make" : "中国北京",
"number" : "粤A8888"
},
{
"brand" : "华晨宝马",
"make" : "中国",
"number" : "粤A9999"
}
],
"address" : "广东省深圳市南山区某讯大厦1号",
"desc" : "长相帅气,高大威猛,人中龙凤,擅长写代码"
}
},
{
"_index" : "employee",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.0,
"_source" : {
"id" : 1,
"name" : "张小勇",
"age" : "45",
"leader" : {
"name" : "马某",
"age" : 40,
"depart" : "营销部"
},
"car" : [
{
"brand" : "丰田",
"make" : "日本",
"number" : "粤A12345"
},
{
"brand" : "奔驰",
"make" : "德国",
"number" : "粤A9999"
}
],
"address" : "浙江杭州西湖阿里马巴巴高薪技术开发区110号",
"desc" : "长相不丑,擅长营销...."
}
}
]
}
}

注意 : fuzzy不进行query分词查询,match也可以进行query分词模糊查询

GET /employee/_search
{
  "query": {
    "match": {
      "desc": {
        "query": "长相",
        "fuzziness": 1
      }
    }
  }
}

查询结果:

{
"took" : 5,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 0.49274418,
"hits" : [
{
"_index" : "employee",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.49274418,
"_source" : {
"id" : 1,
"name" : "张小勇",
"age" : "45",
"leader" : {
"name" : "马某",
"age" : 40,
"depart" : "营销部"
},
"car" : [
{
"brand" : "丰田",
"make" : "日本",
"number" : "粤A12345"
},
{
"brand" : "奔驰",
"make" : "德国",
"number" : "粤A9999"
}
],
"address" : "浙江杭州西湖阿里马巴巴高薪技术开发区110号",
"desc" : "长相不丑,擅长营销...."
}
},
{
"_index" : "employee",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.38656068,
"_source" : {
"id" : 2,
"name" : "张某龙",
"age" : "40",
"leader" : {
"name" : "马x腾",
"age" : 40,
"depart" : "研发部"
},
"car" : [
{
"brand" : "奔驰",
"make" : "中国北京",
"number" : "粤A8888"
},
{
"brand" : "华晨宝马",
"make" : "中国",
"number" : "粤A9999"
}
],
"address" : "广东省深圳市南山区某讯大厦1号",
"desc" : "长相帅气,高大威猛,人中龙凤,擅长写代码"
}
}
]
}
}

3.4suggest推荐查询

搜索一般都会要求具有“搜索推荐”或者叫“搜索补全”的功能,即在用户输入搜索的过程中,进行自动补全或者纠错。以此来提高搜索文档的匹配精准度,进而提升用户的搜索体验。

3.4.1TermSuggester

针对单独term的搜索推荐,可以对单个term进行建议或者纠错,不考虑搜索短语中多个term的关系

3.4.2PhraseSuggester

PhraseSuggester即短语建议器,但是phrasesuggester在termsuggester的基础上,考虑多个term之间的关系,比如是否同时出现一个索引原文中,相邻程度以及词频等,但是据说有坑,就是返回的内容不一定是文档中包含的。

3.4.3Completion Suggester

自动补全,自动完成,支持三种查询:前缀查询(prefix)|模糊查询(fuzzy)|正则表达式查询(regex),主要针对的应用场景就是"Auto Completion"。 此场景下用户每输入一个字符的时候,就需要即时发送一次查询请求到后端查找匹配项,在用户输入速度较高的情况下对后端响应速度要求比较苛刻。因此实现上它和前面两个Suggester采用了不同的数据结构,索引并非通过倒排来完成,而是将analyze过的数据编码成FST和索引一起存放。对于一个open状态的索引,FST会被ES整个装载到内存里的,进行前缀查找速度极快。 但是FST只能用于前缀查找 ,这也是Completion Suggester的局限所在。

综上所述,自动推荐补全有以下特点
a.基于内存而非索引,性能强悍。
b.需要结合特定的completion类型
c.只适合前缀推荐

prefix query :基于前缀查询的搜索提示,是最常用的一种搜索推荐查询。
prefix:客户端搜索词
field:建议词字段
size:需要返回的建议词数量(默认5)
skip_duplicates:是否过滤掉重复建议,默认false

fuzzy query :模糊匹配词项
fuzziness:允许的偏移量,默认auto
transpositions:如果设置为true,则换位计为一次更改而不是两次更改,默认为true。
min_length:返回模糊建议之前的最小输入长度,默认 3
prefix_length:输入的最小长度(不检查模糊替代项)默认为 1
unicode_aware:如果为true,则所有度量(如模糊编辑距离,换位和长度)均以Unicode代码点而不是以字节为单位。这比原始字节略慢,因此默认情况下将其设置为false。

regex query :可以用正则表示前缀,不建议使用

重新添加索引,在需要自动补全搜索字段上添加completion子类型,并重新插入数据

PUT /employee
{
	"settings": {
		"index": {
			"refresh_interval": "1s",
			"number_of_shards": 1,
			"max_result_window": "10000",
			"number_of_replicas": 0
		}
	},
	"mappings": {
		"properties": {
			"id": {
				"type": "long"
			},
			"name": {
				"type": "keyword"
			},
			"age": {
				"type": "integer"
			},
			"create_date": {
				"type": "date",
				"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
			},
			"address": {
				"type": "keyword"
			},
			"desc": {
				"type": "text",
				"fields": {
					"keyword": {
						"type": "keyword",
						"ignore_above": 256
					},
					"completion": {
						"type": "completion"
					}
				}
			},
			"leader": {
				"type": "object"
			},
			"car": {
				"type": "nested",
				"properties": {
					"brand": {
						"type": "keyword",
						"ignore_above": 256
					},
					"number": {
						"type": "keyword",
						"ignore_above": 256
					},

					"make": {
						"type": "keyword",
						"ignore_above": 256
					}
				}
			}
		}
	}
}

a.前缀搜索,下面只能搜到以 "长相" 开头的短语

GET employee/_search?pretty
{
  "_source": ["name","desc"], 
  "suggest": {
    "descCompletion": {
      "prefix": "长相",
      "completion": {
        "field": "desc.completion"
      }
    }
  }
}

返回结果:
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 0,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"suggest" : {
"descCompletion" : [
{
"text" : "长相",
"offset" : 0,
"length" : 2,
"options" : [
{
"text" : "长相不丑,擅长营销....",
"_index" : "employee",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "张小勇",
"desc" : "长相不丑,擅长营销...."
}
},
{
"text" : "长相帅气,高大威猛,人中龙凤,擅长写代码",
"_index" : "employee",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"name" : "张某龙",
"desc" : "长相帅气,高大威猛,人中龙凤,擅长写代码"
}
}
]
}
]
}
}
b.模糊查询匹配前缀

标准分词器,不好搞,暂时略

GET employee/_search?pretty
{
	"_source": ["name", "desc"],
	"suggest": {
		"descCompletion": {
			"prefix": "长",
			"completion": {
				"field": "desc.completion",
				"skip_duplicates": true,
				"fuzzy": {
					"fuzziness": 5,
					"transpositions": false,
					"min_length": 1,
					"prefix_length": 1
				}
			}
		}
	}
}

查询结果
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 0,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"suggest" : {
"descCompletion" : [
{
"text" : "长",
"offset" : 0,
"length" : 1,
"options" : [
{
"text" : "长相不丑,擅长营销....",
"_index" : "employee",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "张小勇",
"desc" : "长相不丑,擅长营销...."
}
},
{
"text" : "长相帅气,高大威猛,人中龙凤,擅长写代码",
"_index" : "employee",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"name" : "张某龙",
"desc" : "长相帅气,高大威猛,人中龙凤,擅长写代码"
}
}
]
}
]
}
}

c.正则匹配词语前缀,正则搜"长*"有结果,但是搜"长相*"则无结果,因为标准分词器没有"长相"该词项,都是单字

GET employee/_search?pretty
{
  "suggest": {
    "descCompletion": {
      "regex": "长*",
      "completion": {
        "field": "desc.completion",
        "size": 10
      }
    }
  }
}

搜索结果

{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 0,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"suggest" : {
"descCompletion" : [
{
"text" : "长*",
"offset" : 0,
"length" : 2,
"options" : [
{
"text" : "长相不丑,擅长营销....",
"_index" : "employee",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"id" : 1,
"name" : "张小勇",
"age" : "45",
"leader" : {
"name" : "马某",
"age" : 40,
"depart" : "营销部"
},
"car" : [
{
"brand" : "丰田",
"make" : "日本",
"number" : "粤A12345"
},
{
"brand" : "奔驰",
"make" : "德国",
"number" : "粤A9999"
}
],
"address" : "浙江杭州西湖阿里马巴巴高薪技术开发区110号",
"desc" : "长相不丑,擅长营销...."
}
},
{
"text" : "长相帅气,高大威猛,人中龙凤,擅长写代码",
"_index" : "employee",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"id" : 2,
"name" : "张某龙",
"age" : "40",
"leader" : {
"name" : "马x腾",
"age" : 40,
"depart" : "研发部"
},
"car" : [
{
"brand" : "奔驰",
"make" : "中国北京",
"number" : "粤A8888"
},
{
"brand" : "华晨宝马",
"make" : "中国",
"number" : "粤A9999"
}
],
"address" : "广东省深圳市南山区某讯大厦1号",
"desc" : "长相帅气,高大威猛,人中龙凤,擅长写代码"
}
}
]
}
]
}
}

3.4.4ContextSuggester

a.CompletionSuggester的筛选器,通过设置向下文映射来实现
b.在索引和查询启用上下文的完成字段时,必须提供上下文
c.添加上下文映射会增加completion的字段的索引大小。并且这一过程法发生在堆中

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch-Kibana使用教程 的相关文章

随机推荐

  • JUnit单元测试

    几乎全是基于JUnit4的 毕竟idea里面默认就是JUnit4 要是有基于JUnit5的会额外标出 框架介绍 1 是一个开源的java语言单元测试框架 2 特点 使用断言 Assertion 测试期望结果 方便组织运行测试 查看测试结果
  • 2023 年,网络安全领域有哪些令人印象深刻的大事件?

    一 美国医疗设备巨头遭到网络攻击 100万人敏感信息被泄露 医疗设备制造商ZOLL表示 1月份的一次网络攻击暴露了超过100万人的敏感信息 在提供给缅因州总检察长的文件中表明 事件始于1月28日 当时他们在其内部网络上 检测到异常活动 可能
  • Python Rich模块:打造绚丽多彩的命令行界面

    概要 在Python编程领域 命令行界面是开发者经常接触的环境之一 然而 传统的命令行界面通常只能呈现简单的文本信息 难以展现丰富的数据和交互效果 幸运的是 有一款名为Rich的Python模块 它能够让我们在命令行界面中创建出绚丽多彩的图
  • 无尘车间装修设计方案

    无尘车间是工业生产中非常重要的一个环节 它能够提供高度洁净的生产环境 保证产品在生产过程中的质量和安全性 因此 无尘车间的装修设计方案对于其使用效果和性能具有至关重要的影响 SICOLAB喜格 将详细介绍无尘车间的装修设计方案 包括设计原则
  • 苍穹分页查询

    controller 员工分页查询 employeeDTO return GetMapping page ApiOperation 员工分页查询 public Result
  • 基于知识图谱的推荐系统设计与优化

    随着互联网的快速发展 推荐系统在各个领域中扮演着重要的角色 然而 传统的推荐系统往往只基于用户行为数据进行推荐 忽略了用户的兴趣和需求之间的关联 为了解决这个问题 基于知识图谱的推荐系统应运而生 本文将探讨基于知识图谱的推荐系统的设计与优化
  • 扩展Spring MVC框架的消息转换器

    扩展Spring MVC框架的消息转换器 param Override protected void extendMessageConverters List
  • nodejs+vue+elementui咖啡商城销售系统qi99g

    现如今 咖啡在线销售是商业贸易中的一条非常重要的途径 可以把其从传统的实体模式中解放中来 网上销售可以为消费者提供巨大的便利 通过咖啡在线销售这个平台 可以使用户足不出户就可以了解现今的咖啡信息 为用户提供了极大的方便 咖啡在线销售的主要功
  • 怎么把视频字幕提取成文本?亲测好用的方法分享

    你是否曾经遇到过这样的问题 想要提取视频中的字幕 却不知道该如何操作 别担心 现在有一些视频字幕提取软件 它们可以帮助我们轻松地提取视频中的字幕 无论是英文还是中文 视频字幕提取软件都可以准确地提取出视频中的字幕文本 并保存为文本文件或复制
  • 视频转文字的app哪个好用?亲测好用的软件分享

    想象一下 当你在观看视频讲座或教学资料时 你希望把老师讲解的重点内容记录下来 以便后续的回顾和整理 但是手动输入文字真的是太麻烦了 这时 视频转文字软件就派上了用场 你只需简单地将视频上传到软件中 它会立即将视频中的对话或讲解转化为文字形式
  • C#8.0本质论第十五章--支持标准查询操作的集合接口

    C 8 0本质论第十五章 支持标准查询操作的集合接口 集合在C 3 0中通过称为语言集成查询 Language Integrated Query LINQ 的一套编程API进行了大刀阔斧的改革 通过一系列扩展方法和Lambda表达式 LIN
  • 大数相乘,限制:不可用 BigInt

    大数相乘 限制 不可用 BigInt 大数相乘 限制 不可用 BigInt 例如 输入 a 11111111111111111111 b 22222222222222222222 返回 246913580246913580241975308
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • 通过mount命令挂载另一台linux服务器的目录到本机

    说明 本次操作的目的是将另一台机器 192 168 1 100 的 backup目录挂载到本机的新建目录 back 1 在被挂载目录的机器上开启NFS服务并编辑 etc exports文件 1 1 查看是否已安装nfs 查看知道已安装 rp
  • 使用docker切换任意版本cuda使用GPU

    1 现存问题 在主机上运行很多下载来的机器学习代码时 这些大都运行在不同版本的tensorflow gpu或者pytorch等的包下的 但是 运行代码的过程中 存在匹配的问题 1 不同的版本的tensorflow gpu或pytorch对c
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • 【经典蓝牙 SSP协议介绍】

    协议定义 SSP Secure Simple Pairing 安全简单配对 协议目的 1 为用户简化配对过程 2 维护或提高蓝牙无线技术的安全性 安全性指两点目标 1 被动窃听保护 2 中间人 MITM 攻击保护 协议流程 下面说下我认为的
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • 【网络安全】网络安全的标准和规范

    网络安全的标准和规范是网络安全领域的重要组成部分 它们为网络安全提供了技术依据 规定了网络安全的技术要求和操作方式 帮助我们构建安全的网络环境 下面 我们将详细介绍一些主要的网络安全标准和规范 以及它们在实际操作中的应用 一 ISO IEC
  • Elasticsearch-Kibana使用教程

    1 索引操作 1 1创建索引 PUT employee settings index refresh interval 1s number of shards 1 max result window 10000 number of repl