plainelastic.net elasticsearch实现搜索业务

转载 2017年10月18日 10:42:32
本文介绍使用plainelastic elasticsearch先介绍api使用方法,然后给出一个实现搜索业务的一个plainelastic.net实例教程 1、PlainElastic.Net下载 1)源码下载:https://github.com/Yegoroff/PlainElastic.Net 2)通
本文介绍使用plainelastic elasticsearch先介绍api使用方法,然后给出一个实现搜索业务的一个plainelastic.net实例教程

 1、PlainElastic.Net下载

  1)源码下载:https://github.com/Yegoroff/PlainElastic.Net

  2)通过NuGet Packages下载

  使用plainelastic elasticsearch实现搜索业务

  备注:通过这种方式下载,有可能因为PlainElastic.Net引用的Newtonsoft.Json.dll版本与原有项目中的不一致到报错,因此建议下载源码,将源码中的Newtonsoft.Json.dll版本更换为当前项目的版本

 2、封装PlainElastic.Net帮助类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PlainElastic.Net;
using PlainElastic.Net.Queries;
using PlainElastic.Net.Serialization;

namespace Amy.Toolkit.PlainElastic
{
    public class ElasticSearchHelper
    {
        public static readonly ElasticSearchHelper Intance = new ElasticSearchHelper();

        private ElasticConnection Client;

        private ElasticSearchHelper()
        {
            Client = new ElasticConnection("localhost", 9200);
        }

        /// <summary>
        /// 数据索引
        /// </summary>       
        /// <param name="indexName">索引名称</param>
        /// <param name="indexType">索引类型</param>
        /// <param name="id">索引文档id,不能重复,如果重复则覆盖原先的</param>
        /// <param name="jsonDocument">要索引的文档,json格式</param>
        /// <returns>索引结果</returns>
        public IndexResult Index(string indexName, string indexType, string id, string jsonDocument)
        {

            var serializer = new JsonNetSerializer();

            string cmd = new IndexCommand(indexName, indexType, id);

            OperationResult result = Client.Put(cmd, jsonDocument);

            var indexResult = serializer.ToIndexResult(result.Result);

            return indexResult;
        }

        /// <summary>
        /// 数据索引
        /// </summary>       
        /// <param name="indexName">索引名称</param>
        /// <param name="indexType">索引类型</param>
        /// <param name="id">索引文档id,不能重复,如果重复则覆盖原先的</param>
        /// <param name="jsonDocument">要索引的文档,object格式</param>
        /// <returns>索引结果</returns>
        public IndexResult Index(string indexName, string indexType, string id, object document)
        {
            var serializer = new JsonNetSerializer();

            var jsonDocument = serializer.Serialize(document);

            return Index(indexName, indexType, id, jsonDocument);
        }

        /// <summary>
        /// 全文检索
        /// </summary>
        /// <typeparam name="T">搜索类型</typeparam>
        /// <param name="indexName">索引名称</param>
        /// <param name="indexType">索引类型</param>
        /// <param name="query">查询条件(单个字段或者多字段或关系)</param>
        /// <param name="from">当前页(0为第一页)</param>
        /// <param name="size">页大小</param>
        /// <returns>搜索结果</returns>
        public SearchResult<T> Search<T>(string indexName, string indexType, QueryBuilder<T> query, int from, int size)
        {
            var queryString = query.From(from).Size(size).Build();
            
            var cmd = new SearchCommand(indexName, indexType);

            var result = Client.Post(cmd, queryString);

            var serializer = new JsonNetSerializer();

            return serializer.ToSearchResult<T>(result);
        }
    }
}

 3、在control中的实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using PlainElastic.Net;
using PlainElastic.Net.Queries;
using Amy.WebUI.Controllers;


namespace Amy.WebUI.Areas.Admin.Controllers
{
    public class SearchController : BasicController
    {
        /// <summary>
        /// 创建索引/更新索引
        /// </summary>
        public ActionResult AddIndexByPlainElastic(Models.SearchObject model)
        {
            if (string.IsNullOrEmpty(model.Id))
            {
                model.Id = IDHelper.Id32;
            }

            model.DateTime = DateTime.Now;

            var result = Amy.Toolkit.PlainElastic.ElasticSearchHelper.Intance.Index("db_test", "searchobject", model.Id, model);

            return JRCommonHandleResult(!string.IsNullOrEmpty(result._id));
        }

        /// <summary>
        /// 搜索数据
        /// </summary>
        public ActionResult SearchByPlainElastic(string key, int page = 0)
        {
            #region 定义查询内容
            var query = new QueryBuilder<Models.SearchObject>()
                //查询,多字段匹配(Title和Content匹配key中的任意一个单词)
                .Query(x =>
                    x.QueryString(t => t.Fields(obj => obj.Title, obj => obj.Content).Query(key))
                )
                //过滤,数据为启用状态并且大小在40~150之间
                .Filter(x => 
                    x.And(w=>
                        w.Term(t => t
                            .Field(obj => obj.IsEnable).Value("true")
                        )
                        .Range(t => t
                            .Field(obj => obj.Size).From("40").To("150")
                        )
                    )
                )
                //排序,按照时间倒序排列
                .Sort(x => x.Field("DateTime", SortDirection.desc))
                //高亮,定义高亮样式及字段
                .Highlight(h => h
                    .PreTags("<b>")
                    .PostTags("</b>")
                    .Fields(
                        f => f.FieldName("Title").Order(HighlightOrder.score),
                        f => f.FieldName("Content").Order(HighlightOrder.score),
                        f => f.FieldName("_all")
                    )
                );
            #endregion

            var result = Amy.Toolkit.PlainElastic.ElasticSearchHelper.Intance.Search<Models.SearchObject>("db_test", "searchobject", query, page, 10);

            #region 拼装查询内容
            var list = result.hits.hits.Select(c => new Models.SearchObject()
            {
                Id = c._source.Id,
                Title = c.highlight == null ? c._source.Title : c.highlight.Keys.Contains("Title") ? string.Join("", c.highlight["Title"]) : c._source.Title, //高亮显示的内容,一条记录中出现了几次
                Content = c.highlight == null ? c._source.Content : c.highlight.Keys.Contains("Content") ? string.Join("", c.highlight["Content"]) : c._source.Content, //高亮显示的内容,一条记录中出现了几次
                Size = c._source.Size,
                IsEnable = c._source.IsEnable,
                DateTime = c._source.DateTime,
            }).ToPageList(page + 1, 10, result.hits.total);
            #endregion

            return JRSuccess(list.ToJsonByJsonNet());
        }

    }
}

 4、代码中使用到的伪搜索对象

namespace Amy.WebUI.Areas.Admin.Models
{
    public class SearchObject
    {
        public string Id { get; set; }

        public string Title { get; set; }

        public string Content { get; set; }

        public int Size { get; set; }

        public bool IsEnable { get; set; }

        public DateTime DateTime { get; set; }
    }
}

 5、UI测试页面效果

ElasticSearch.net NEST批量创建修改删除索引完整示例

本示例采用Elasticsearch+Nest 网上查了很多资料,发现用C#调用Elasticsearch搜索引擎的功能代码很分散,功能不完整,多半是非常简单的操作,没有成型的应用示例。比如新增或修改...
  • qq_18145031
  • qq_18145031
  • 2016年12月02日 19:57
  • 3030

ELaticSearch——PlainElastic.net.dll 中的JsonNetSerializer

之前为了尽量减少对ES类库的使用,对于ES查询返回的结果,直接使用NewtonJson的json转化器, 结果最后发现搜索结果的Json中有聚合的结果,但是转化成SearchResult 就怎么也看...
  • Shiyaru1314
  • Shiyaru1314
  • 2015年12月01日 17:26
  • 1273

ElasticSearch.net第五步-c#操作ElasticSearch详解

前面我们讲解了关于ElasticSearch的安装配置,以及CRUD 本章我将讲解怎么使用c#操作ElasticSearch。 首先你需要一定的技术储备,比如:asp.net webapi...
  • simdrv
  • simdrv
  • 2017年11月19日 07:55
  • 230

[ElasticSearch]那些年踩过的ElasticSerch坑

1. 索引名称错误 1.1 代码 xiaosi@Qunar:~$ curl -XPUT 'localhost:9200/Quanr/employee/1'  '> {>     "first_nam...
  • SunnyYoona
  • SunnyYoona
  • 2016年10月12日 22:30
  • 4416

elasticsearch判断索引是否存在

指定索引名,判断指定的索引是否存在集群中 /** * 判断指定的索引名是否存在 * @param indexName 索引名 * @return 存在:true; ...
  • likui1314159
  • likui1314159
  • 2016年06月21日 15:09
  • 5754

[Elasticsearch] 常用查询和操作总结

1. 取得某个索引中某个字段中的所有出现过的值这种操作类似于使用SQL的SELECT UNIQUE语句。当需要获取某个字段上的所有可用值时,可以使用terms聚合查询完成:GET /index_str...
  • dm_vincent
  • dm_vincent
  • 2015年08月28日 00:12
  • 46205

Elasticsearch 内置的两个客户端的区别

Java连接ElasticSearch详解Java连接ES有两种连接方式(即获得ES的Client)1、创建一个node,加入集群中,通过这个node获得client。2、通过TransportCli...
  • sidongxue2
  • sidongxue2
  • 2017年06月28日 11:31
  • 1609

plainelastic.net elasticsearch实现搜索业务

本文介绍使用plainelastic elasticsearch先介绍api使用方法,然后给出一个实现搜索业务的一个plainelastic.net实例教程 1、PlainElastic.Net下载 ...
  • hezheqiang
  • hezheqiang
  • 2017年10月18日 10:42
  • 415

ElasticSearch——常用网址

1. ES官方文档,可作为参考手册。 https://www.elastic.co/guide/en/elasticsearch/reference/master/cat-master.html 2...
  • Shiyaru1314
  • Shiyaru1314
  • 2016年06月24日 10:24
  • 684

elasticsearch 实现联想输入搜索

通常,在项目中需要联想输入(即输入关键字,提示相关词条,类似百度google的搜索)的需求,可能大家都是用的数据库的like '%关键字%‘来实现。但是这样实现有几个问题。 第一、这样的搜索无论...
  • LanSeTianKong12
  • LanSeTianKong12
  • 2017年02月09日 11:02
  • 1751
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:plainelastic.net elasticsearch实现搜索业务
举报原因:
原因补充:

(最多只允许输入30个字)