3.elasticsearch文档查询dsl

【README】

1.本文elasticsearch版本是 7.2.1;

2.文档查询语句叫做 DSL, domain structure language, 领域特定语言;dsl,参见 Query DSL | Elasticsearch Guide [7.2] | Elastic

3.elasticsearch 基于json 提供了完整的查询 DSL 语句(Domain Specific Language-领域特定语言)来定义查询,把查询的dsl看做一种查询的抽象语法树,包含两种类型的查询;

  • 1.叶子查询子句:叶子查询子句在特定字段中寻找特定值,如匹配(match),术语(term)或范围查询(range) ;
  • 2.复合查询子句: 复合查询子句包裹了其他叶子查询或复合查询,并以逻辑方式组合多个查询(如bool,dis_max 查询),或变更他们的行为(如 constant_score 不计算评分);

4.查询子句的行为不同,具体取决于它们是用于查询上下文还是过滤器上下文

  • 查询上下文:若查询条件的字段类型是字符串,则计算文档相关性分数;
  • 过滤器上下文:若查询条件的字段类型是字符串,则不计算文档分数;

5.查询dsl api分类(包括但不限于,本文仅列出常用查询api);

  • match_all,查询所有文档;
  • match,全文检索(若字段是非字符串,则精确匹配,若是字符串类型,则是模糊匹配)
  • match_phrase,短语匹配;
  • multi_match,多字段匹配;
  • bool,组合多个查询子句的复合查询,子句包括 must, must_not, should, filter 等;
  • filter过滤器查询(不计算文档评分);
  • term,术语查询(精确匹配)
  • constant_score,常量分数查询(不计算文档分数);

6.本文es文档数据来源于  content-elasticsearch-deep-dive/accounts.json at master · linuxacademy/content-elasticsearch-deep-dive · GitHubMyles Elastic Certified Engineer Course. Contribute to linuxacademy/content-elasticsearch-deep-dive development by creating an account on GitHub.https://github.com/linuxacademy/content-elasticsearch-deep-dive/blob/master/sample_data/accounts.json,批量导入,参见 2.elasticsearch文档批量操作-bulk api_PacosonSWJTU的博客-CSDN博客

中的  “【2】bulk 批量导入样本数据章节”;

7.elasticsearch查询 dsl api 是否计算文档分数统计表


【1】match_all ,查询所有文档

0)match_all 查询所有文档,给定文档分数为1.0 (不计算文档分数,给定1.0)

1)分页查询银行账户索引文档;

// 【sql】
Select firstname, balance
From bank
Order by balance desc
Limit 5 offset 0/5 // elasticsearch match_all api 
Post localhost:9200/bank/_search{"_source":["firstname", "balance"],"query":{"match_all":{}}, "sort":[{"balance":"desc"}], "from":5/0 // 文档偏移量为5 或者 0 , "size":5  // 每页5个文档 
}

【2】match-全文检索

match匹配结果:返回与提供的文本、数字、日期或布尔值匹配的文档。

  • 若匹配的字段类型是字符串,则在匹配之前会对查询条件的字符串进行分词(如hello world 会分词为 hello和 world两个单词);
  • 匹配查询是执行全文搜索的标准查询,包括模糊匹配选项。

【2.1】精确匹配

1)match 匹配非字符串类型字段,就是精确匹配

  • 因为非字符串类型字段的值没有建立倒排索引(分词),值就是它本身;

2)查询余额等于  49568 的客户信息文档

Post localhost:9200/bank/_search
{"_source":["firstname", "balance"],"query":{"match":{"balance":49568}}   
}{"took": 18,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 1.0, // 评分默认为1,没有计算文档评分"hits": [{"_index": "bank","_type": "account","_id": "168","_score": 1.0, // 评分默认为1,没有计算文档评分 "_source": {"firstname": "Carissa","balance": 49568}}]}
}

【2.2】match-模糊匹配(计算文档评分)

0)match匹配字符串类型字段,就是模糊匹配;

1)查询地址包含 Kings 的银行客户文档

Post  localhost:9200/bank/_search {"_source":["firstname", "balance","address"],"query":{"match":{"address":"Kings"}}   
}{"took": 7,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 2,"relation": "eq"},"max_score": 5.9908285,// 显然计算了文档评分 "hits": [{"_index": "bank","_type": "account","_id": "20","_score": 5.9908285,"_source": {"firstname": "Elinor","address": "282 Kings Place","balance": 16418}},{"_index": "bank","_type": "account","_id": "722","_score": 5.9908285,"_source": {"firstname": "Roberts","address": "305 Kings Hwy","balance": 27256}}]}
}

【小结】match的字段类型是字符串时 (注意match的字段类型是非字符串,则是精确匹配

  • 全文检索按照评分进行排序;
  • 全文检索会对检索条件进行分词匹配; 

【3】match_phrase 短语匹配 (不分词)

1)match_phrase短语匹配:把需要匹配的值当做一个整体单词(不分词)进行检索;

  • 而match 模糊匹配: 把需要匹配的值先进行分词,然后检索;

2)match 全文检索例子(查询结果有19个文档)

Post  localhost:9200/bank/_search 
{"_source":["firstname", "balance","address"],"query":{"match":{"address":"mill lane"}}   
}

【解析】

  • match 全文检索,会把 mill lane 分为2个单词,查询出包含2个单词中的一个即可;

3)match_phrase:短语匹配例子 (查询结果只有1个文档)

Post localhost:9200/bank/_search
{"_source":["firstname", "balance","address"],"query":{"match_phrase":{"address":"mill lane"}}   
}{"took": 2,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 9.507477,"hits": [{"_index": "bank","_type": "account","_id": "136","_score": 9.507477,"_source": {"firstname": "Winnie","address": "198 Mill Lane","balance": 45801}}]}
}

【解析】match_phrase:把 mill lane 当做一个整体,不分词,送入es查询包含 mill lane的文档;


【4】multi_match 多字段匹配

1)场景: 查询出 state或address字段包含 mill 的文档;

Post  localhost:9200/bank/_search 
{"_source":["firstname", "balance","address","state"],"query":{"multi_match":{"query":"mill", "fields":["state", "address"]}}   
}// 查询结果
{"took": 2,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 4,"relation": "eq"},"max_score": 5.4032025,"hits": [{"_index": "bank","_type": "account","_id": "970","_score": 5.4032025,"_source": {"firstname": "Forbes","address": "990 Mill Road","balance": 19648,"state": "AK"}},
...... 
}

【4.1】多字段匹配给定的分词条件

1)场景: 查询出 state或address字段包含 mill 或 KY的文档;  

{"_source":["firstname", "balance","address","state"],"query":{"multi_match":{"query":"mill KY", "fields":["state", "address"]}}   
}

【5】bool复合查询(组合多个查询条件 )

【5.1】定义

1)bool 用来做复合查询;

  • bool复合查询可以合并任何其他查询语句,包括复合语句;
  • 复合语句之间可以相互嵌套,可以表达非常复杂的逻辑;  

2)bool 复合查询可以包含的查询子句

  • ① must(计算文档分数)
  • ② must_not(不计算文档分数)
  • ③ should(计算文档分数)
  • ④ filter (不计算文档分数)

【5.2】bool复合查询例子

1)场景: 查询gender等于M,state等于KY,且 age不等于28,或者 lastname等于 Hancock的文档;

  • should表示或者,如果匹配,则评分更高;
Post  localhost:9200/bank/_search  
{"query":{"bool":{"must":[{"match":{"gender":"M"}},{"match":{"state":"KY"}}],"must_not":[{"match":{"age":"28"}}],"should":[{"match":{"lastname":"Hancock"}}]}}
}// 查询结果 
{"took": 8,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 6,"relation": "eq"},"max_score": 11.173532,"hits": [{"_index": "bank","_type": "account","_id": "640","_score": 11.173532, // 计算文档得分 "_source": {"account_number": 640,"balance": 35596,"firstname": "Candace","lastname": "Hancock","age": 25,"gender": "M","address": "574 Riverdale Avenue","employer": "Animalia","email": "candacehancock@animalia.com","city": "Blandburg","state": "KY"}},
............................ 

【6】filter过滤器(不计算文档分数)

1)filter 不计算文档分数 ;  

  • Bool复合查询中的must,should,must_not 被称为查询子句;
  • 其中 must或should会计算相关性评分以表示一个文档对查询条件的匹配程度;分数越高,文档就越匹配查询条件;
  • 但 must_not 被当做一个过滤器,过滤器不会计算文档匹配的分数;

【6.1】不用filter过滤器查询例子 (计算评分)

1)不用filter的查询(计算分数)

场景:查询年龄大于等于18,且小于等于30,且address包含mill的文档;

注意: match:{"address":"mill"} 表示的是 address包含mill,并不是address等于mill

Post  localhost:9200/bank/_search
{"query":{"bool":{"must":[{"range":{"age":{"gte":18,"lte":30}}}, {"match":{"address":"mill"}}]}}
}// 查询结果
{"took": 2,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 6.4032025,"hits": [{"_index": "bank","_type": "account","_id": "970","_score": 6.4032025,// 计算分数 "_source": {"account_number": 970,"balance": 19648,"firstname": "Forbes","lastname": "Wallace","age": 28,"gender": "M","address": "990 Mill Road","employer": "Pheast","email": "forbeswallace@pheast.com","city": "Lopezo","state": "AK"}}]}
}

【6.2】用filter过滤器查询(不计算分数)

1)用filter过滤器查询,就不会计算文档的相关性分数;

  • 因为filter不计算分数,filter的查询性能优于 match匹配查询

2)场景:查询年龄大于等于18,且小于等于30,且address包含mill的文档;

查询结果的分数为0.0,显然 filter不会计算分数

Post  localhost:9200/bank/_search 
{"query":{"bool":{"filter":[{"range":{"age":{"gte":18,"lte":30}}}, {"match":{"address":"mill"}}]}}
}{"took": 2,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 0.0,"hits": [{"_index": "bank","_type": "account","_id": "970","_score": 0.0,  // 没有计算得分 "_source": {"account_number": 970,"balance": 19648,"firstname": "Forbes","lastname": "Wallace","age": 28,"gender": "M","address": "990 Mill Road","employer": "Pheast","email": "forbeswallace@pheast.com","city": "Lopezo","state": "AK"}}]}
}

【6.3】把 filter 作为bool的查询子句

1)场景:查询 gender等于M,且state等于KY,且age不等于28,或者 lastname等于 Hancock,且 age在25到30之间的文档;

  • 其中 must,should子句计算评分, must_not, filter 不计算评分; 
Post  localhost:9200/bank/_search 
{"query":{"bool":{"must":[{"match":{"gender":"M"}},{"match":{"state":"KY"}}],"must_not":[{"match":{"age":"28"}}],"should":[{"match":{"lastname":"Hancock"}}], "filter":{"range":{"age":{"gte":"25","lte":"30"}}}}}
}
// 查询结果 
{"took": 4,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 11.173532,"hits": [{"_index": "bank","_type": "account","_id": "640","_score": 11.173532,"_source": {"account_number": 640,"balance": 35596,"firstname": "Candace","lastname": "Hancock","age": 25,"gender": "M","address": "574 Riverdale Avenue","employer": "Animalia","email": "candacehancock@animalia.com","city": "Blandburg","state": "KY"}}]}
}

2)如何使得上述bool查询中的must,should 不计算分数呢 ?将其嵌套在 filter 里面,如下:

post localhost:9200/bank/_search
{"query":{"bool":{"filter":{"bool":{"must":[{"match":{"gender":"M"}},{"match":{"state":"KY"}}],"must_not":[{"match":{"age":"28"}}],"should":[{"match":{"lastname":"Hancock"}}], "filter":{"range":{"age":{"gte":"25","lte":"30"}}}}}}}
}// 查询结果
{"took": 368,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 0.0,"hits": [{"_index": "bank","_type": "account","_id": "640","_score": 0.0, // 显然没有计算文档分数"_source": {"account_number": 640,"balance": 35596,"firstname": "Candace","lastname": "Hancock","age": 25,"gender": "M","address": "574 Riverdale Avenue","employer": "Animalia","email": "candacehancock@animalia.com","city": "Blandburg","state": "KY"}}]}
}

【7】term查询(术语查询),精确匹配

1)定义:

  • term查询返回给定字段包含精确值的文档;

2)注意:

  • ① 避免对 text 字段进行term查询;
  • ② 默认情况下,Elasticsearch 会在分析过程中更改文本字段的值(分词)。 这会使查找文本字段值的精确匹配变得困难。
  • ③ 要查询 text字段,使用match(模糊查询)

3)term 与 match 区别:

  • ① term: 精确查询(不分词);
  • ② match: 模糊查询(查询字段的类型是字符串,要分词);

【7.1】term查询例子

1)场景1:查询 address 等于 574 Riverdale Avenue 的文档 ;
es文档中的address被分词了,而term查询对 574 Riverdale Avenue 进行精确查询(不分词),所以查无记录。

{"query":{"term":{"address":"574 Riverdale Avenue"}}
}// 为空。

2)场景2:查询 address.keyword 等于 574 Riverdale Avenue 的文档 (查询 address不分词时 等于 574 Riverdale Avenue  的文档 )

{"query":{"term":{"address.keyword":"574 Riverdale Avenue" // 这里匹配的是 address的keyword属性 }}
}{"took": 1,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 6.5032897,"hits": [{"_index": "bank","_type": "account","_id": "640","_score": 6.5032897,// 显然 term 要评分"_source": {"account_number": 640,"balance": 35596,"firstname": "Candace","lastname": "Hancock","age": 25,"gender": "M","address": "574 Riverdale Avenue","employer": "Animalia","email": "candacehancock@animalia.com","city": "Blandburg","state": "KY"}}]}
}

【结果分析】

  • 显然term精确匹配会计算评分,其经常嵌套在 filter里面,以不计算评分

【7.2】address.keyword 与 match_phrase 区别

1)address.keyword 查无记录;因为是精确匹配(不分词);

场景:查询地址等于 574 Riverdale 的文档;

{"query":{"term":{"address.keyword":"574 Riverdale"}}
}
// 查无记录 

2)match_phrase 是部分匹配,包含 574 Riverdale  即可(有值)

{"query":{"match_phrase":{"address":"574 Riverdale"}}
}// 查询结果 
{"took": 1,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 12.492344,"hits": [{"_index": "bank","_type": "account","_id": "640","_score": 12.492344,"_source": {"account_number": 640,"balance": 35596,"firstname": "Candace","lastname": "Hancock","age": 25,"gender": "M","address": "574 Riverdale Avenue","employer": "Animalia","email": "candacehancock@animalia.com","city": "Blandburg","state": "KY"}}]}
}

【小结】

  • 若是查询非 text字段,则使用term做精确查询;
  • 若是查询 text字段,则使用 match来全文检索;
  • 若使用match做精确匹配,则使用 field.keyword 进行;
  • 若是查询 text字段的部分匹配(短语匹配,不对字符串不分词),则使用 match_phrase ;

【8】constant_socre 常量分数查询

1)constant_score 不计算分数;

2)constant_score 参数有2个:filter 和 boost

  • filter:必须有;filter查询不会计算相关性分数;为了加速性能,elasticsearch自动缓存频繁使用的 filter查询;
  • boost:可选,浮点型,用于指定每个文档的分数,默认为1.0;

场景:查询年龄在大于等于25,且小于等于30的文档;

post localhost:9200/bank/_search {"query":{"constant_score":{"filter":{"range":{"age":{"gte":"25","lte":"30"}}}           }}
}// 查询结果 
{"took": 4,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 273,"relation": "eq"},"max_score": 1.0,"hits": [{"_index": "bank","_type": "account","_id": "13","_score": 1.0, // 显然,文档分数默认为1.0 "_source": {"account_number": 13,"balance": 32838,"firstname": "Nanette","lastname": "Bates","age": 28,"gender": "F","address": "789 Madison Street","employer": "Quility","email": "nanettebates@quility.com","city": "Nogal","state": "VA"}},
......
} 

参考自: Constant score query | Elasticsearch Guide [7.2] | Elastichttps://www.elastic.co/guide/en/elasticsearch/reference/7.2/query-dsl-constant-score-query.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle入门(十四.19)之触发器简介

一、触发器的需求让我们从一个例子开始吧:一条业务规则规定,只要员工的工资发生变化,变更就必须记录在日志记录表中。 可以创建两个过程来执行此操作:UPD_EMP_SAL更新工资,LOG_SAL_CHANGE将行插入日志表。可以从UPD_EM…

搜狐视频Redis私有云cachecloud开源了

项目地址:https://github.com/sohutv/cachecloud/ 一、CacheCloud是做什么的 CacheCloud提供一个Redis云管理平台:实现多种类型(Redis Standalone、Redis Sentinel、Redis Cluster)自动部署、解决Redis实例碎片化现象、提供完善统计、监控、运维功能、减…

springboot 订单重复提交_瞬间几千次的重复提交,我用Spring Boot+Redis扛住了

在实际的开发项目中,一个对外暴露的接口往往会面临,瞬间大量的重复的请求提交,如果想过滤掉重复请求造成对业务的伤害,那就需要实现幂等!我们来解释一下幂等的概念:任意多次执行所产生的影响均与一次执行的…

Oracle入门(十四.21)之创建DML触发器:第二部分

一、使用条件谓词 在上文中,看到了一个触发器,可以防止在周末插入EMPLOYEES: CREATE OR REPLACE TRIGGER secure_emp BEFORE INSERT ON employees BEGINIF TO_CHAR(SYSDATE,DY) IN (SAT,SUN) THENRAISE_APPLICATION_ERROR(-20500,You may ins…

【直播预告】创享未来 2016微软开发者峰会

感谢所有中国开发者对2016微软开发者峰会的热情关注,目前活动已经截止报名了,不过M姐为大家带来新的福利: 2016微软开发者峰会将全程线上直播! 2016微软开发者峰会将全程线上直播! 2016微软开发者峰会将全程线上直播…

定时任务重启后执行策略_C语言操作时间函数time.ctime,实现定时执行某个任务小例子...

时间操作函数在实际项目开发中会经常用到,最近做项目也正好用到就正好顺便整理一下。时间概述由上图可知:通过系统调用函数time()可以从内核获得一个类型为time_t的1个值,该值叫calendar时间,即从1970年1月1日的UTC时间从0时0分0妙…

Oracle入门(十四.20)之创建DML触发器:第一部分

一、什么是DML触发器?DML触发器是执行SQL DML语句(INSERT,UPDATE或DELETE)时自动触发(执行)的触发器。 您可以通过两种方法对DML触发器进行分类: •执行时间:BEFORE,AFTE…

IIS负载均衡-Application Request Route详解第四篇:使用ARR实现三层部署架构

本篇的主要目的是带领大家一起来使用ARR来实现一个三层部署架构。这里的三层部署架构主要是由:服务层,应用程序服务器层已经数据层实现。如下图所示: 每次一提到“层”这个字的时候,似乎感觉这个字特别的惹火。很多朋友开始讨论起…

c遗传算法的终止条件一般_KDD比赛之遗传算法(举例理解)

求最大值问题是这样的:求解函数 f(x) x 10*sin(5*x) 7*cos(4*x) 在区间[0,9]的最大值。这个函数大概长这样:那么如何应用遗传算法如何来找到这个奇怪的函数的最大值呢?事实上,不管一个函数的形状多么奇怪,遗传算法都…

6.elasticsearch查询与过滤上下文(query context与filter contenxt)以及term术语查询

【README】 1.本文总结自: Query and filter context | Elasticsearch Guide [7.2] | Elastichttps://www.elastic.co/guide/en/elasticsearch/reference/7.2/query-filter-context.html2.文档相关性分数是否被计算,取决于查询子句是在查询上下文&…

Oracle入门(十四.22)之创建DDL和数据库事件触发器

一、什么是DDL和数据库事件触发器?DDL语句触发DDL触发器:CREATE,ALTER或DROP。 数据库事件触发器由数据库中的非SQL事件触发,例如: •用户连接到数据库或与数据库断开连接。 •DBA启动或关闭数据库。•用户会话中引发了…

Visual Studio上开发Python?你不可不知道的六大功能!

Visual Studio 2013/2015 搭配 Python Tools for Visual Studio 扩充套件让 Visual Studio 能提供对 Python 程序语言高度整合的开发环境,并完整发挥 Visual Studio 强大的功能,协助您在 Visual Studio 内开发 Python 程序上如虎添翼,提升开发…

qt中sendevent_Qt中postEvent和sendEvent函数

Qt中postEvent和sendEvent函数部分内容参考http://blog.csdn.net/lvmengzou/article/details/65450908qt事件循环需要维护一个事件队列,在Qt的main函数中最后一般调用QApplication::exec()成员函数来保持程序对事件队列的处理,exec()的实质是不停调用pro…

IIS负载均衡-Application Request Route详解第五篇:使用ARR来配置试点项目

看到本篇的题目,大家可能感到有点奇怪!下面,我们就来看看这到底是什么意思。 大家可能遇到过这样的一种情况:希望根据某些请求用户的特性,将用户的请求导向不同的站点(请大家这里区分“亲缘性”的概念&…

Oracle入门(十四.23)之管理触发器

一、触发器需要特权要在模式中创建触发器,需要: •CREATE TRIGGER系统特权 •触发器主体中引用的其他架构中的对象的普通对象特权(SELECT,UPDATE,EXECUTE等) •与触发器关联的表或视图上的ALTER特权。触发器…

为什么哲学是最难的学科_什么是哲学哲学对大师来说可能非常理论化,没有一定哲学基础肯能很难 爱问知识人...

我的总结是科学哲学是从哲学角度考察科学的一门学科。它以科学活动和科学理论为研究对象,探讨科学的本质、科学知识的获得和检验、科学的逻辑结构等有关科学认识论和科学方法论的基本问题。哲学是什么?这是一个问题,一个既简单又复杂的问题。…

8.es更新文档通过版本号实现并发控制

【README】 1.本文介绍了es更新文档时的并发控制策略;2.通过版本号实现并发控制(类似于mysql中基于版本号的乐观锁);3.Es为支持并发控制,为每篇文章设置了版本号_version。初始值为1,每更新1次加1。…

Oracle入门(十五)之数据库锁

一、锁的概念 锁是数据库用来控制共享资源并发访问的机制。锁用于保护正在被修改的数据直到提交或回滚了事务之后,其他用户才可以更新数据二、锁定的优点 一致性 - 一次只允许一个用户修改数据完整性 - 为所有用户提供正确的数据。如果一个用户进行了修改并保存&a…

.NET 和 Mono 的一点历史

提到微软公司研发 .NET Framework 的初衷,难免要提到 SUN 公司1995年推出的 Java 语言。由于 Java 在业界得到了广泛的支持而且迅速建立了庞大的生态系统,微软也不得不考虑如何加以应对,毕竟自己手里的 Visual Basic 和 Visual C 和 Java 一比…

lisp 角平分线_证明冯奥贝尔定理的3种方法

怎样证明冯奥贝尔定理?Von.Aubel定理: 以任意四边形ABCD的边为斜边作四个转向相同的等腰直角三角形ΔABE,ΔBCF,ΔCDG,ΔDAH。则:EGFH,EG⊥FH。关于上述定理的几点说明:(1),条件是任意四边形,所…