由于最近的一个项目中的搜索部分要用到 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. QWT编译与配置-Windows/Linux环境

    QWT编译与配置-Windows/Linux环境 QWT和FFTW两种开源组件是常用的工程软件支持组件,QWT可以提供丰富的绘图组件功能,FFTW是优秀数字波形分析软件.本文使用基于LGPL版权协议的 ...

  2. java 递归打印20个斐波那契数

    class Test { public static void main(String[] args) { // feibo j=new feibo(); for (int n = 1; n < ...

  3. 从Github开源项目《云阅》所学到的知识

    感谢开源,感谢大神,才让我们这些菜鸟成长! 附上云阅开源项目地址:点我吧. 1.轮播图的实现. 现在的APP基本都会实现这个功能吧,然后一直都找不到好的第三方库,能够满足各种需求.然而碰到了这个开源库 ...

  4. 【转】odoo 新API装饰器中one、model、multi的区别

    http://blog.csdn.net/qq_18863573/article/details/51114893 1.one装饰器详解 odoo新API中定义方式: date=fields.Date ...

  5. 抓猫_KEY

    抓猫 题面如下: [ 题目描述] 流浪猫布满城市的每一个角落, 非常影响市容市貌, 作为城市聘请的抓猫者, 你有一 种捕捉器, 一定可以捕捉到所有走到里面的猫, 更加幸运的是你有一个非常厉害的动物心理 ...

  6. 优步UBER司机全国各地奖励政策汇总 (2月1日-2月7日)

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

  7. CF 570 D. Tree Requests

    D. Tree Requests http://codeforces.com/problemset/problem/570/D 题意: 一个以1为根的树,每个点上有一个字母(a-z),每次询问一个子树 ...

  8. Ubentu下命令行安装chrome浏览器

    前言: 最近在使用Ubuntu 系统.编译Android aosp 项目.准备写博客,但是Ubuntu 的默认浏览器 firefox 在写csdn 的时候,加载不出来.如下图 一直卡在这里. 这种情况 ...

  9. java中的比较:instanceof、equals(hashcode)、==

    import javassist.expr.Instanceof; class Person{ String s; Person(String s){ this.s=s; } } class Man ...

  10. Visual Studio 起始页中不显示最近使用的项目的解决办法

    将 HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Policies/Explorer/NoRecentDocsHistory的 ...