ES 是 Elastic Search 的缩写,可以理解为一个支持分布式部署的软件。

部署了以后可以当数据库用,虽然官方不建议这样做,但我们是这样干的。

它解决了很多场景下的查询需求,发版速度飞快,用的人蛮多的,使用 Java 开发并开源。

我刚接触没几天遇到了很多坑,在这里记录一下。

  1、如何精确查询中文字段?

使用 keyword 特性,让分析器不进行拆词,然后使用 term query。如:

 [Keyword(Name = nameof(CompanyName), Index = true)]
public string CompanyName { get; set; }
        /// <summary>
/// Term Query 根据公司名称查询
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public IEnumerable<EnterpriseCreditInfo> SearchByName(string name)
{
var searchedList = this.client
.Search<EnterpriseCreditInfo>(
m => m.Index(index).Query(q =>
//q.MatchPhrase(mc => mc.Field(ff => ff.CompanyName).Query(name))
q.Term(t => t.Field(f => f.CompanyName).Value(name))
));
return searchedList.Hits.Select(m =>
{
m.Source.Id = m.Id;
return m.Source;
});
}

  2、为什么使用 text 特性 标记后使用 term query 查询中文查不到数据?如:

[Text(Name = nameof(CompanyName), Index = true)]
public string CompanyName { get; set; }

Text 特性和 Keyword 特性都是表示 string 类型的。

  其中 Keyword 特性表示将索引 field 的值。

  Text 表示使用分析器进行拆词索引多个 term 。

所以 Text 可以指定分词器而 Keyword 则不行。 如指定 ik 中文分词器:

 [Text(Name = nameof(CompanyName), Index = true, Analyzer = "ik")]
public string CompanyName { get; set; }

至于为什么无法命中索引,是因为默认的 Analyzer = "standard" 分词器会将中文分成一个汉字一个 term 所以直接查询 term 是查询不到的。

  3、如何分词查询中文(全文搜索)?可以使用 match 系列 。自己百度去。

  4、使用 Nest 创建索引的方法有哪些?

        /// <summary>
/// 默认的初始化 client
/// </summary>
/// <param name="nodes">服务器集群</param>
/// <param name="index">索引名</param>
protected virtual void InitClient(IEnumerable<Uri> nodes, string index)
{
var pool = new StaticConnectionPool(nodes); var settings = new ConnectionSettings(pool);
settings.DefaultIndex(index);
settings.DisableDirectStreaming(true);//影响性能发布时注释,用于抓取 request 和 response。
client = new ElasticClient(settings.ThrowExceptions()); //直接抛出异常,发布时去掉。
var exits = client.IndexExists(index); if (!exits.Exists)
{
CreateIndex(index + "_real", index);//默认使用别名,方便索引重建。
}
}
        /// <summary>
/// 当索引不存在的时候创建索引。
/// 根据 <see cref="Nest.ElasticsearchTypeAttribute"/> 自动映射类型
/// 默认创建 NumberOfShards = 5
/// 默认创建 NumberOfReplicas = 1,
/// </summary>
/// <param name="index"></param>
protected virtual void CreateIndex(string index, string Alias)
{
var descriptor = new CreateIndexDescriptor(index)
.Settings(s =>
s.NumberOfShards().NumberOfReplicas())
.Aliases(m => m.Alias(Alias))
.Mappings(ms => ms.Map<T>(m => m
.Properties(ps => ps
.Text(t => t.Name(n => n.Id))
.Text(t => t.Name(n => n.CreateTime).Index(true)))
.AutoMap())); client.CreateIndex(descriptor); }

5、如何使用类似于 sql-in 的查询操作?

  使用操作符| 、& 等拼接 term query ,可以实现各种查询,如 term any (网上抄的):

        /// <summary>
/// term any item of <paramref name="values"/>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="descriptor"></param>
/// <param name="field"></param>
/// <param name="values"></param>
/// <returns></returns>
protected static QueryContainer TermAny(QueryContainerDescriptor<T> descriptor, Field field, IEnumerable<string> values)
{
QueryContainer q = new QueryContainer();
foreach (var value in values)
{
q |= descriptor.Term(t => t.Field(field).Value(value));
}
return q;
}

6、其他注意事项:

1、小写,index 和 type 要小写,否则抛异常。

term 是小写的。所以比如 term query

descriptor.Term(t => t.Field(field).Value("Foo")); 辣鸡 查不出来。用 keyword 不知道区不区分,一会试试再补。

 帮到你的话点赞。

												

ES 使用小结的更多相关文章

  1. ES使用小结之索引Rollover

    Elasticsearch 使用小结之索引Rollover 索引名 一般而言,客户端将数据每天写入一个索引,比如直接写入YYYY-MM-HH格式的索引,那么我们只需要在写入的客户端里面获取时间,然后得 ...

  2. Elasticsearch全文检索实战小结

    一.项目概述 这是一个被我称之为“没有枪.没有炮,硬着头皮自己造”的项目.项目是和其它公司合作的三个核心模块开发. 使用ES的目的是: 1).采集数据.网站数据清洗后存入ES: 2).对外提供精确检索 ...

  3. gitbook 入门教程之使用 gitbook-cli 开发电子书

    gitbook 生成电子书主要有三种方式: gitbook-cli 命令行操作,简洁高效,适合从事软件开发的相关人员. gitbook-editor 编辑器操作,可视化编辑,适合无编程经验的文学创作者 ...

  4. 《死磕 Elasticsearch 方法论》:普通程序员高效精进的 10 大狠招!(完整版)

    原文:<死磕 Elasticsearch 方法论>:普通程序员高效精进的 10 大狠招!(完整版) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链 ...

  5. 有关于OpenGL、OpenGL ES、WebGL的小结

    转自原文 有关于OpenGL.OpenGL ES.WebGL的小结 一.   OpenGL简介 OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言.跨平台的编程接口 ...

  6. Linux环境下段错误的产生原因及调试方法小结(转)

    最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation F ...

  7. Linux环境下段错误的产生原因及调试方法小结

    转载自http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之 ...

  8. Unity3d 经验小结

      Unity3d 经验小结 文本教程 你是第2541个围观者 0条评论 供稿者:Jamesgary 标签:unity3d教程 Fbx.贴图导入Unity时的注意事项: 在导出Fbx之前,Maya中已 ...

  9. simple_html_dom使用小结

    simple_html_dom使用小结 分类: PHP2012-08-31 14:24 3094人阅读 评论(0) 收藏 举报 htmlcallbackstringdivfunctionfile  1 ...

随机推荐

  1. Spring Boot + Spring Cloud 构建微服务系统(二):服务消费和负载(Ribbon)

    使用RestTemplate调用服务 在上一篇教程中,我们是这样调用服务的,先通过 LoadBalancerClient 选取出对应的服务,然后使用 RestTemplate 进行远程调用. Load ...

  2. 一直性hash解决扩容后的hash算法不用变

    转自: http://blog.codinglabs.org/articles/consistent-hashing.html 摘要 本文将会从实际应用场景出发,介绍一致性哈希算法(Consisten ...

  3. React Native顶|底部导航使用小技巧

    导航一直是App开发中比较重要的一个组件,ReactNative提供了两种导航组件供我们使用,分别是:NavigatorIOS和Navigator,但是前者只能用于iOS平台,后者在ReactNati ...

  4. 基于vue2.0实现仿百度前端分页效果(二)

    前言 上篇文章中,已经使用vue实现前端分页效果,这篇文章我们单独将分页抽离出来实现一个分页组件 先看实现效果图 代码实现 按照惯例,我们在冻手实现的时候还是先想一想vue实现组件的思路 1.需要提前 ...

  5. Xshell6设置字体大小

    Xshell可以远程连接到linux服务器,但有时终端字体太小,可以按照如下步骤修改字体大小: 菜单栏: 文件-属性-外观,修改字体大小后点击确定即可(也可以使用ALT+P快捷键打开属性).

  6. MySQL中的事务及读写锁实现并发访问控制

    一.并发控制中锁的概念 锁是并发控制中最核心的概念之一,在MySQL中的锁分两大类,一种是读锁,一种是写锁,读锁也可以称为共享锁(shared lock),写锁也通常称为排它锁(exclusive l ...

  7. Linux中rm命令详解

    linux下rm命令使用详解---linux删除文件或目录命令 用户可以用rm命令删除不需要的文件.该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除 ...

  8. [转]npm、 cnpm、yarn

    本文转自:https://blog.csdn.net/sinat_34682450/article/details/79473658 终于搞懂了三者之间的关系- 要知道三者之间的关系首先要了解三个包管 ...

  9. SQL 同一张表中相同字段的内容合并为一条记录(不同字段的那一列每个记录后面加逗号)

    一.创建表 create table stuUnion ( sid int identity primary key, cid int, id ) ) 二.添加数据 insert into stuUn ...

  10. 为什么90%的CTO 都做不好绩效管理

    ​ 十多年从业经历,从 2001 年开始带团队到现在,我几乎经历过所有的 IT 角色.2010 年,我随创始团队筹建国美在线至今,经历了从几百单到现在日均百万订单,从只有家电品类到现在全品类.金融.大 ...