NEST.net Client For Elasticsearch简单应用

由于最近的一个项目中的搜索部分要用到 Elasticsearch 来实现搜索功能,苦于英文差及该方面的系统性资料不好找,在实现时碰到了不少问题,现把整个处理过程的代码分享下,给同样摸索的人一些借鉴,同时希望有经验的大牛发现有问题的地方不吝斧正!
 
 

查询入口

webapi 的部分代码,把查询条件封装到 eJobQueryPosition 中
var param = new eJobQueryPosition
            {
                IndustryPost = industryPost,
                Region = region,
                MinSalary = minSalary,
            };
//调用搜索
var gl = await _queryBusiness.QueryPositionsAsync(param, skip, top, string.Empty);
 
//处理结果
if (gl.IsError)
            return FailActionRequest(gl.webapi_error);
            if (gl.total <= 0)
            {
                return OkActionRequest(gl);
            }
           
            return OkListActionRequest(gl);
 

QueryPositionsAsync 部分代码

var resultData = await _queryPostion.QueryAsync(condition, skip, top, searchText);

//查看搜索语句
            //var temp= Encoding.UTF8.GetString(resultData.RequestInformation.Request).Trim();

if (!resultData.Hits.Any())
            {
                return new GListResult<eJobPositionSimple>(new eJobPositionSimple[0]);
            }
            var result = resultData.Documents;

var g1 = result.Select(position => new eJobPositionSimple
            {
                Pstn_Id = position._id,
                ...
                Phone = position.Phone, 
                Name = position.BrandName,
            }).ToList();
            
            return new GListResult<eJobPositionSimple>(g1, (int) resultData.Total);

QueryAsync部分代码

/// <summary>
        /// 生成搜索客户端
        /// </summary>
        /// <returns></returns>
        private static ElasticClient GetSearchClient()
        {
            var connectString = ConfigurationManager.ConnectionStrings["ElasticSearch"].ConnectionString;
            var nodesStr = connectString.Split('|');
            var nodes = nodesStr.Select(s => new Uri(s)).ToList();
            var connectionPool = new SniffingConnectionPool(nodes);
            var settings = new ConnectionSettings(connectionPool).SetDefaultIndex("position");
            settings.SetDefaultPropertyNameInferrer(p => p.ToString());
            var client = new ElasticClient(settings);
            return client;
        }
 
//web.config 中 ElasticSearch 的设置  <add name="ElasticSearch" connectionString="http://192.168.1.7:7200" />  //默认为9200端口
        public async Task<ISearchResponse<QPosition>> QueryAsync(eJobQueryPosition condition, int skip, int top, string searchText = "")
        {
            var client = GetSearchClient();

var resultData = await client.SearchAsync<QPosition>(s =>
                s.Index("position").Type("tbJobPosition").
                    Query(
                        q => QueryContainerPosition(condition, searchText, q)).
                    SortDescending(f => f.UpdateTime).Skip(skip).Take(top));
            return resultData;
        }

 
        /// <summary>
        /// 生成职位查询表达式
        /// </summary>
        /// <param name="condition">职位条件</param>
        /// <param name="searchText">查询的关键字</param>
        /// <param name="q">用于返回的查询表达式</param>
        /// <returns>返回用于搜索的表达式</returns>
        private static QueryContainer QueryContainerPosition(eJobQueryPosition condition, string searchText, QueryDescriptor<QPosition> q)
        {
            var query = new QueryContainer();
            //未过有效期
            query &= q.Range(rr => rr.OnField(ff => ff.ExpireTime).GreaterOrEquals(DateTime.UtcNow.Date));

if (!string.IsNullOrWhiteSpace(searchText))
            {
                query &= QueryText(searchText, q, query);    
            }  
            return query;

 
   //该部分补充说明 在这里可以构造多个搜索条件 如下
            /*
            var query1 = new QueryContainer();
            query1 = q.Term(s => s.OnField(ff => ff.BrandName).Value("szbrandname1"));

var query2 = new QueryContainer();
            query2 = q.Term(s => s.OnField(ff => ff.BrandName).Value("szbrandname2"));

var query3 = new QueryContainer();
            query2 = q.Term(s => s.OnField(ff => ff.BrandName).Value("szbrandname3"));
            query = query1 || query2 || query3;

            // or  query = (query1 || query2) && query3;
            //说明 各条件 || 等同 query 中的should; && 等同 must 
           //部分搜索条件可改用filter性能会更好,略
          */
        }
 
        /// <summary>
        /// 搜索文本表达式,一定要放在所有表达式的最后
        /// </summary>
        /// <param name="searchText">搜索文本</param>
        /// <param name="q">搜索表达式</param>
        /// <param name="query">要返回的搜索表达式类</param>
        /// <returns></returns>
        private static QueryContainer QueryText(string searchText, QueryDescriptor<QPosition> q, QueryContainer query)
        {
            if (!string.IsNullOrWhiteSpace(searchText))
            {
                query = q.MatchPhrase(p => p.OnField(o => o.Descript).Query(searchText));
            }
            return query;
        }
 
以上代码分别放到相应的cs文件中即可实现postion的搜索功能
部分应用要加哦
using System;
using System.Configuration;
using System.Linq;
using System.Threading.Tasks;
using **.Entity;
using Elasticsearch.Net.ConnectionPool;
using Nest;

参考资料网址

http://nest.azurewebsites.net/nest/core/

NEST.net Client For Elasticsearch简单应用的更多相关文章

  1. (转)NEST.net Client For Elasticsearch简单应用

    由于最近的一个项目中的搜索部分要用到 Elasticsearch 来实现搜索功能,苦于英文差及该方面的系统性资料不好找,在实现时碰到了不少问题,现把整个处理过程的代码分享下,给同样摸索的人一些借鉴,同 ...

  2. NEST.net Client

    NEST.net Client For Elasticsearch简单应用 由于最近的一个项目中的搜索部分要用到 Elasticsearch 来实现搜索功能,苦于英文差及该方面的系统性资料不好找,在实 ...

  3. Elastcisearch.Nest 7.x 系列`伪`官方翻译:通过 NEST 来快捷试用 Elasticsearch

    本系列已经已经全部完成,完整版可见:https://blog.zhuliang.ltd/categories/Elasticsearch/ 本系列博文是"伪"官方文档翻译(更加本土 ...

  4. Elasticsearch简单使用和环境搭建

    Elasticsearch简单使用和环境搭建 1 Elasticsearch简介 Elasticsearch是一个可用于构建搜索应用的成品软件,它最早由Shay Bannon创建并于2010年2月发布 ...

  5. elasticsearch简单查询

    elasticsearch简单查询示例: { "from": "0", //分页,从第一页开始 "size": "10" ...

  6. elasticsearch简单实现

    初次接触分布式是全文搜索引擎,之前都是spinx+coreseek,先简单实现初步了解先 官方文档:https://www.elastic.co/guide/cn/elasticsearch/guid ...

  7. [000]socket通信--server和client实现的简单例子

    在C语言中就学过scanf和printf,其实理解socket就跟这两个输入输出差不多,只不过是信息的传输而已. 1.TCP服务器端(server)的默认函数调用顺序: 按照上述的调用顺序,我们可以来 ...

  8. 转:ElasticSearch 简单入门

    原文来自于:http://www.oschina.net/translate/elasticsearch-getting-started?cmp 教程样例 我们将要部署一个非常简单的应用--在一个部门 ...

  9. 分布式ElasticSearch简单介绍

    这里我们解释一些通用的术语,比如集群(cluster).节点(node)和分片(shard).Elasticsearch的扩展机制,以及它怎样处理硬件故障.在此将探索怎样创建你的集群(cluster) ...

随机推荐

  1. 单例模式(Winform窗体的实现)

    在我的设计模式分类当中,我选择单例模式作为我第一个要写的设计模式,其一,单例模式简单.容易理解让人接受,其二,单例模式很常用,在实际的Winform窗体应用开发中能够带来更好的客户体验. 单例模式的核 ...

  2. 基本的Web控件二

    ListBox控件 ListBox控件用于创建多选的列表框,而可选项是通过ListItem元素来定义的. ListBox控件常用的属性: 1.Count:表示列表框中条目的总数. 2.Items:表示 ...

  3. [原]Python 简单异常处理

    s=raw_input("Input your age:") if s =="": raise Exception("Input must no be ...

  4. Spring web Flow2学习笔记

    想抽时间研究一下Spring web Flow2,能够找到的唯一电子书是<深入解析Spring+MVC与Web Flow>,我现在摘录本书的一段内容如下,通过这一段,大家可以想象中文背景的 ...

  5. Linux下的Source命令及脚本的执行方式解析

    Linux Source命令及脚本的执行方式解析 http://blog.csdn.net/wangyangkobe/article/details/6595143 当我修改了/etc/profile ...

  6. 图片来自腾讯,未经授权不可引用,js解决方法

    问题记录,解决后来更新 js伪造Referer, 外链图片让用户浏览时,不发送 referer 字段给原网站的方法 A 网站引用了 B 站的 图片 <img src="b_url&qu ...

  7. Linux命令行修改IP、网关、DNS的方法

    Linux中在命令行中修改IP地址.网关.DNS的方法. 网卡eth0    IP修改为 102.168.0.1 复制代码代码如下: ifconfig eth0 102.168.0.1 netmask ...

  8. php 安装pdo_mysql 扩展

    如果pdo在linux下出现exception 'PDOException' with message 'could not find driver'则问题是php编译时少加--with-pdo-my ...

  9. Using-jqGrid-s-search-toolbar-with-multiple-filter

    http://www.codeproject.com/Articles/58357/Using-jqGrid-s-search-toolbar-with-multiple-filter

  10. 5.css字体

    下面的用一个表格总结了文本样式中字体的一些设置方法: 属性名 说明 CSS 版本 font-size 设置字体的大小 1 font-variant 设置英文字体是否转换为小型大写 1 font-sty ...