(转)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/

时间: 2024-11-07 23:53:02

(转)NEST.net Client For Elasticsearch简单应用的相关文章

NEST.net Client

NEST.net Client For Elasticsearch简单应用 由于最近的一个项目中的搜索部分要用到 Elasticsearch 来实现搜索功能,苦于英文差及该方面的系统性资料不好找,在实现时碰到了不少问题,现把整个处理过程的代码分享下,给同样摸索的人一些借鉴,同时希望有经验的大牛发现有问题的地方不吝斧正! 查询入口 webapi 的部分代码,把查询条件封装到 eJobQueryPosition 中 var param = new eJobQueryPosition         

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

本系列已经全部完成,完整版可见 :https://blog.zhuliang.ltd/categories/Elasticsearch/ 本系列博文是"伪"官方文档翻译(更加本土化),并非完全将官方文档进行翻译,而是在查阅.测试原始文档并转换为自己真知灼见后的"准"翻译.有不同见解 / 说明不周的地方,还请海涵.不吝拍砖 :) 官方文档见此:https://www.elastic.co/guide/en/elasticsearch/client/net-api/cu

转:ElasticSearch 简单入门

原文来自于:http://www.oschina.net/translate/elasticsearch-getting-started?cmp 教程样例 我们将要部署一个非常简单的应用--在一个部门里的雇员--这样我们可以把注意力放在功能而不是氧立得复杂性上.总而言之,这篇博文是为了帮助人们开始ElasticSearch入门. 1)现在打开你的cygwin窗口并且键入命令 curl -XPUT 'http://localhost:9200/dept/employee/32' -d '{ "em

ElasticSearch简单使用

What is ElasticSearch ? Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库. 但是,Lucene只是一个库.想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的. Elasticsearch也使用Java开发并使用Lucene作为其核心来实现

使用Java High Level REST Client操作elasticsearch

说明 在明确了ES的基本概念和使用方法后,我们来学习如何使用ES的Java API. 本文假设你已经对ES的基本概念已经有了一个比较全面的认识. 客户端 你可以用Java客户端做很多事情: 执行标准的index,get,delete,update,search等操作. 在正在运行的集群上执行管理任务. 但是,通过官方文档可以得知,现在存在至少三种Java客户端. Transport Client Java High Level REST Client Java Low Level Rest Cl

分布式ElasticSearch简单介绍

这里我们解释一些通用的术语,比如集群(cluster).节点(node)和分片(shard).Elasticsearch的扩展机制,以及它怎样处理硬件故障.在此将探索怎样创建你的集群(cluster).节点(node)和分片(shards),使其依照你的需求进行扩展.并保证在硬件故障时数据依然安全. 一个节点(node)就是一个Elasticsearch实例,而一个集群(cluster)由一个或多个节点组成,它们具有同样的cluster.name.它们协同工作,分享数据和负载. 当增加新的节点或

Python Socket Client及Server简单编程

本文主要介绍使用Python语言编写Socket协议Server及Client的简单实现方法. 1. Python Socket编程简介 Socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 三种流行的套接字类型是:stream,datagram和raw.stream和datagram套接字可以直接与TCP协议进行接口,而raw套接字则接口到IP协议. Python Socket模块提供了对低层BSD套接字样式网络的访问,使用

Elasticsearch简单配置

Elasticsearch配置详细和详细描述如下 http://rockelixir.iteye.com/blog/1883373 在此,对Elasticsearch进行如下简单配置 cluster.name: es_cluster node.name: "es1"  node.master: true  node.data: true network.host: 192.168.81.128 # network.bind_host: 192.168.81.128 # network.

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

在C语言中就学过scanf和printf,其实理解socket就跟这两个输入输出差不多,只不过是信息的传输而已. 1.TCP服务器端(server)的默认函数调用顺序: 按照上述的调用顺序,我们可以来写个最简单的"hello world" server程序. 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<unistd.h> 5 #inclu