C# ES开发记录
1、查询
ES表的人员实体
///
/// 人员列表
///
public class TestESPersonDemo
{
///
/// Id
///
public string Id { get; set; }
///
/// 姓名
///
public string Name { get; set; }
///
/// 身份证号
///
public string IdCardNO { get; set; }
///
/// 年龄
///
public string Age{ get; set; }
///
/// 添加时间
///
public string CreateTime{ get; set; }
}
//定义查询条件列表
Var whereQueryList = new List
//1、等于查询
whereQueryList.Add(x => x.Term(p => p.Id , condition.Id ));
//2、In(List.contains)查询
whereQueryList.Add(x => x.Terms(p => p.Field(f => f.Id).Terms(condition.Ids)));
//3、日期查询: 查询范围:例如某一天
var startTime =CreateTime.AddDays(-1);
var endTime = =CreateTime.AddDays(1);
whereQueryList.Add(f => f.DateRange(p => p.Field(r => r.YearMonth).GreaterThan(startTime)));//大于
//whereQueryList.Add(f => f.DateRange(p => p.Field(r => r.YearMonth).GreaterThanOrEquals(startTime)));//大于等于
whereQueryList.Add(f => f.DateRange(p => p.Field(r => r.YearMonth).LessThan(endTime))); //小于
//4、模糊查询Like
//4.1、文字模糊查询 Operator:And和Or(ES是分词查询:例如输入的Name是”张三”,And:查询的是“张三”这两个字连着的数据,Or:查询是包含”张”或者”三”的数据)
whereQueryList.Add(x => x.Match(p => p.Field(f => f.Name).Query(condition.Name).Operator(Operator.And)));
//4.2、纯数字的字符串模糊查询,如身份证、手机号
//whereQueryList.Add(x => x.Wildcard(p => p.IdCardNo, "*" + condition.IdCardNo + "*"))//尽可能头部不加”*”。查询效率速度慢还很耗性能
whereQueryList.Add(x => x.Wildcard(p => p.IdCardNo, condition.IdCardNo + "*"));//注意,这种方式,查询响应比较慢
主要原因: wildcard类似mysql中的like,和分词完全没有了关系。
出现错误: 用户输入的字符串长度没有做限制,导致首尾通配符中间可能是很长的一个字符串。 后果就是对应的wildcard执行非常慢,非常消耗CPU。
根本原因: 为了加速通配符和正则表达式的匹配速度,Lucene4.0开始会将输入的字符串模式构建成一个DFA (Deterministic Finite Automaton),带有通配符的pattern构造出来的DFA可能会很复杂,开销很大。
可能的优化方案:
wildcard应杜绝使用通配符打头,实在不得已要这么做,就一定需要限制用户输入的字符串长度。
选用合适的分词器,比如nGram tokenizer预处理数据,然后使用更廉价的term query来实现同等的模糊搜索功能。
2、Kibana使用
2.1、查询
查询全部
GET TestESPersonDemo/_search
查询指定条件
GET TestESPersonDemo/_search
{
"query":{
"term": {
"Id": {
"value": "2"
}
}
}
}
//同一字段多值查询
GET TestESPersonDemo/_search
{
"query":{
"terms": {
"Id": ["1","2","3"]
}
}
}
//多条件查询 must:且 should:或
//范围查询 gte 大于 lte小于
get tax_person/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"idCardNo": "110101199003079753"
}
},
{
"match": {
"Id": "3a01833b-78eb-7341-b662-c111ba703103"
}
}
],
"must_not": [
{"match": { "Name": "erji"}}
],
"should": [
{
"match": {
"Age":"18"
}
}
],
"filter": [
{"range": {
"CreateTime": {
"gte": "2022-02-25T11:35:12.9947065+08:00",
"lte": "2022-03-11T11:35:12.9947065+08:00"
}
}}
]
}
}
}#multi_match指定多个字段查找
Get TestESPersonDemo/_search
{
"query":{
"multi_match": {
"query": "1",
"fields": ["Age","Id"]
}
}
}
2.2、查询表结构
GET /TestESPersonDemo/_mapping
2.3删除单跳数据
DELETE /TestESPersonDemo/_doc/2
2.4删除所有数据
POST /TestESPersonDemo/_doc/_delete_by_query?pretty
{
"query": {
"match_all": {
}
}
}
2.5、添加修改数据(按ID更新数据)
PUT /TestESPersonDemo/_doc/2
{
"Name" : "测试5",
"IdCardNO" : "350102199003073870",
"Id" : "2",
"CreateTime" : "2022-02-15T11:35:12.9947065+08:00"
}
C#ES通用类demo-互联网文档类资源-CSDN下载



