首页 > 学院 > 开发设计 > 正文

ElasticSearch NEST笔记

2019-11-17 02:38:23
字体:
来源:转载
供稿:网友

ElasticSearch NEST笔记

ElasticSearch NEST笔记

1. 什么是ElasticSearch?

ElasticSearch is a powerful open source search and analytics engine that makes data easy to explore.

可以简单理解成索引加检索的工具,当然它功能多于此。ElasticSearch分为服务端与客户端,服务端提供REST API,客户端使用REST API。

2.怎么安装Elastic?

  1. 安装JDK(下载地址)
  2. 安装ElasticSearch(下载地址)
    1. 解压,运行/bin/elasticsearch.bat.
    2. 浏览器输入http://localhost:9200/,可以看到如图:

    3. 安装成功。
  3. 安装ElasticSearch – header pluginhttps://github.com/mobz/elasticsearch-head

    文档中有详细说明

    完成后,在如下图的地方找到一个html

  4. 安装完成~

3. 如何使用NEST客户端(文档:http://nest.azurewebsites.net/nest/quick-start.html)

  1. 连接
    1. var node = new Uri("http://localhost:9200/");
    2. var settings = new ConnectionSettings(
    3. node,
    4. defaultIndex: " geopoint-tests "
    5. );
    6. var client = new ElasticClient(settings);
  2. 添加索引
    1. client.CreateIndex("geopoint-tests");

    上面这句代码是可以不用写的,因为在调用下面的index方法的时候,如果没有指定使用哪个index,ElasticSearch会直接使用我们在setting中的defaultIndex,如果没有,则会自动创建。

    1. client.Index(obj);

    但是如何你需要使用Mapping来调整索引结构,就会需要CreateIndex这个方法。具体的会在下面的Mapping中提到

  3. 添加数据
    1. client.Index(obj)
  4. 搜索

    正常来说,搜索的需求一般是我们传入一个keyWord(和需要搜索的field name),返回符合条件的列表,那么搜索就分为全文搜索和单属性搜索。顾名思义,全文搜索就是用keyword去匹配所有的属性,单属性搜索就是只匹配指定的属性。

  • 全文搜索:
      1. keyword = String.Format("*{0}*", keyword);
        1. //默认的Operator是Or,当keyword是类似于"One Two"之类的中间有空格的时候,会被当成两个关键词搜索,然后搜索结果进行or运算
        2. //所以我们需要根据需求来调整Operator
      2. var searchResults = client.Search<T>(s => s
      3. .Index(index)
      4. .Query(q => q.QueryString(qs => qs.Query(keyword).DefaultOperator(Operator.And)))
      5. );
      6. return searchResults.Documents;

另外由于ES是分词搜索,所以当我们要用"One"来搜索完整的单词"JustOne"的时候,就必须在"One"外面添加**,类似于SQL里面的%keyword%,但是这样的做法会导致在用完整的单词来搜索的时候搜索不到结果,所以我们需要使用下面的方式(如果有更好的方法请不吝赐教):

      1. wholeKeyword = keyword;
      2. keyword = String.Format("*{0}*", keyword);
      3. QueryContainer query = new QueryStringQuery() { Query = keyword, DefaultOperator = Operator.And };
      4. if(!String.IsNullOrEmpty(wholeKeyword)){
      5. QueryContainer wholeWordQuery = new QueryStringQuery() { Query = wholeKeyword };
      6. query = query || wholeWordQuery;
      7. }
      8. var searchResults = client.Search<Person>(s => s
      9. .Index("zhixiao-application")
      10. .Query(query)
      11. );
  • 指定属性搜索

    指定属性的搜索有两种:

  1. 使用term Query
     QueryContainer query2 = new TermQuery { Field = item.Key, Value = item.Value.ToLower() };

Term是一个被索引的精确值,也就是说Foo, foo, FOO是不相等的,因此

在使用term query的时候要注意,term query在搜索的Field已经被索引的时候,是不支持大写的。下面为elasticSearch - header测试

所有数据:

大写搜索:

小写搜索:

NEST的使用:

      1. var searchResults = client.Search<Person>(s => s
      2. .Index("zhixiao-application")
      3. .Query(q => q.Term(t => t.OnField(f => f.Lastname == "keyword")))
      4. );

        或者(效果一样):

      5. QueryContainer termQuery = new TermQuery { Field = "lastname", Value = "keyword" };
      6. var searchResults = client.Search<Person>(s => s
      7. .Index("zhixiao-application")
      8. .Query(termQuery)
      9. );

PS:term query的Field是必须的,如果Field为空,会产生下面的错误           

2.使用 Query String query

QueryString query一般用于全文搜索,但是也可以用于单个属性的搜索(设置DefaultField属性),queryString query可以不区分大小写。QueryString还有一个好处就是我们可以搜索一个term中的一部分,例如lastname为"t Boterhuis 1",那么我们可以用"terhuis"搜索到这个数据(虽然需要在外面包上**),在term query里面就做不到,因为ES把每一个属性的值都分析成一个个单独的term,提高了搜索的效率。

下面为elasticSearch - header测试:

完整term搜索(大写):

完整term搜索(小写):

部分搜索(大写,不带**):

部分搜索(大写,带**):

部分搜索(小写,带**):

多词语搜索:当我们想搜索类似于:"t Boterhuis 2"这样的多个单词构成的keyword(用空格分开),term query是无法查询的,term query顾名思义就是单词查询。不能支持多单词查询

QueryString query:

大家可以看到,第三条也被搜索进来了,这是因为ES把"t Boterhuis 2"解析成了三个词汇"t"" Boterhuis""2"。然后分开搜索,把结果集合并,所以ID为4的记录也被搜索出来了。那么我们如何让合起来搜索呢?

      1. string keyword = "t Boterhuis 2";
      2. QueryContainer wholeWordQuery = new QueryStringQuery() { Query = keyword, DefaultOperator = Operator.And };
      3. var searchResults = client.Search<Person>(s => s
      4. .Index("zhixiao-application")
      5. .Query(wholeWordQuery)
      6. );

QueryString query有一个DefaultOperator的属性,我们可以将其设置为And,这样搜索的时候,ES会将几个term的search结果做and运算。

但是有一个比较大的问题是如果我的keyword是"Aberdeen Boterhuis",

这样也可以搜索出结果来:


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表