博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ES 使用小结
阅读量:6005 次
发布时间:2019-06-20

本文共 3649 字,大约阅读时间需要 12 分钟。

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

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

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

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

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

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

1 [Keyword(Name = nameof(CompanyName), Index = true)]2 public string CompanyName { get; set; }
///         /// Term Query 根据公司名称查询        ///         ///         /// 
public IEnumerable
SearchByName(string name) { var searchedList = this.client .Search
( 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 创建索引的方法有哪些?

///         /// 默认的初始化 client        ///         /// 服务器集群        /// 索引名        protected virtual void InitClient(IEnumerable
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);//默认使用别名,方便索引重建。 } }
///         /// 当索引不存在的时候创建索引。        /// 根据 
自动映射类型 /// 默认创建 NumberOfShards = 5 /// 默认创建 NumberOfReplicas = 1, ///
/// protected virtual void CreateIndex(string index, string Alias) { var descriptor = new CreateIndexDescriptor(index) .Settings(s => s.NumberOfShards(5).NumberOfReplicas(1)) .Aliases(m => m.Alias(Alias)) .Mappings(ms => ms.Map
(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 (网上抄的):

///         /// term any item of 
///
///
/// /// /// ///
protected static QueryContainer TermAny(QueryContainerDescriptor
descriptor, Field field, IEnumerable
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 不知道区不区分,一会试试再补。

 帮到你的话点赞。

 

 

 

转载于:https://www.cnblogs.com/zhuwansu/p/9023337.html

你可能感兴趣的文章
【转载】白话经典算法系列之五 归并排序的实现
查看>>
2012 Multi-University #10
查看>>
JS(去掉前后空格或去掉所有空格)的用法
查看>>
HTML基础-第一讲
查看>>
9. ZooKeeper之搭建单机模式。
查看>>
css sprite讲解与使用实例
查看>>
[置顶] 我的 Java 后端书架 (2016 年暖冬版)
查看>>
Linux常用命令(持续更新中)
查看>>
c语言运算符
查看>>
初步认识消息中间件
查看>>
iOS自动化探索(二)WDA API的使用
查看>>
Oracle拆分字符串,字符串分割的函数。
查看>>
可持久化线段树/主席树 基础原理和例题
查看>>
js实现全选checkbox
查看>>
ajax---异步请求对象的属性和方法
查看>>
创意1
查看>>
leetcode83 Remove Duplicates from Sorted List
查看>>
复习笔记2018.8.3
查看>>
紧急维护,阿里云服务器抢修记
查看>>
数字货币相关
查看>>