由于最近的一个项目中的搜索部分要用到 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简单应用

    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. Python学习笔记八:文件操作(续),文件编码与解码,函数,递归,函数式编程介绍,高阶函数

    文件操作(续) 获得文件句柄位置,f.tell(),从0开始,按字符数计数 f.read(5),读取5个字符 返回文件句柄到某位置,f.seek(0) 文件在编辑过程中改变编码,f.detech() ...

  2. 简单R语言爬虫

    R爬虫实验 R爬虫实验 PeRl 简单的R语言爬虫实验,因为比较懒,在处理javascript翻页上用了取巧的办法. 主要用到的网页相关的R包是: {rvest}. 其余的R包都是常用包. libra ...

  3. jxls-2.x导出excel入门——基本操作

    之前随笔使用的是1.x的比较古老的版本了,已经不再维护,接下来使用较新的2.x的版本进行导出 之前一直按照其他的博客与官网的随笔进行导出,发现一直报错,后面更换了POI的版本为3.16(因为jxls也 ...

  4. Luogu2917_ [USACO08NOV]奶牛混合起来Mixed Up Cows_KEY

    题目传送门 看到数据范围就果断装压. 设f[i][j]表示i状态下最后一个数字为a[j]. code: #include <cstdio> using namespace std; ]; ...

  5. BZOJ2659_算不出的算式_KEY

    题目传送门 其实打表找一找规律可以得出: /************************************************************** Problem: 2659 U ...

  6. 成都Uber优步司机奖励政策(2月25日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  7. 成都Uber优步司机奖励政策(1月11日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  8. 【NIS】深入了解NIS

    1  简介 NIS( NetworkInformation Service)提供了一个网络黄页的功能,当用户登录系统时,Linux系统会到NIS主机上去寻找用户使用的帐号密码信息加以比对,以提供用户登 ...

  9. C# 终本案件、综合执行人、裁判文书爬虫

    终本案件:http://zxgk.court.gov.cn/zhongben/new_index.html 综合执行人:http://zxgk.court.gov.cn/zhixing/new_ind ...

  10. tensorflow学习一

    1.用图(graph)来表示计算任务 2.用op(opreation)来表示图中的计算节点,图有默认的计算节点,构建图的过程就是在其基础上加节点. 3.用tensor表示每个op的输入输出数据,可以使 ...