目录

为什么选择Elastic search?

示例应用程序

如何写文件

如何查询文件

获得什么

资源资源


在这个简单的教程中,我将提供一个简单的演示来向Elasticsearch读写文档,并为C#应用程序添加全文本搜索功能。Elasticsearch是一个分布式的开源搜索引擎,可以管理各种数据。了解将其集成到ASP.NET应用程序有多么简单!

  • GitHub下载示例代码

为什么选择Elastic search?

Elasticsearch是一个分布式的开源搜索引擎,可以管理各种数据。但是,为什么Elasticsearch是全文的最佳解决方案?

我从2009年开始研究全文搜索,当时我必须为数据推荐系统实现搜索算法。这次经历非常有教育意义,但从头开始是一次大屠杀。我第一次获得使用库的机会,我尝试了Apache Lucene来实现全文搜索。随着应用程序架构变得复杂(即,多个服务器需要共享索引数据),Solr提供了可扩展的解决方案。它是一个基于开源API的搜索引擎(基于Lucene)。使用完这些库之后,我使用了Elasticsearch,它现在是市场的领导者。它带有本地免费版本,可在云上使用。它可以从简单的安装扩展到巨大的环境。所以问题是:为什么不呢?

示例应用程序

我在生产以及我的开源headless cms, RawCMS上成功地进行了弹性搜索。为了展示Elasticsearch的工作原理,我创建了一个示例应用程序,其中实现了两个主要功能:

  • 创建索引并向其中添加数据
  • 使用全文查询读取数据

示例代码在GitHub上可用。要运行和测试它,只需下载,编译和执行:

dotnet ElasticSearchTest.dll create -f divina_commedia.txt -h http://localhost:9300
> Index created in 30338ms with 14006 element.dotnet ElasticSearchTest.dll search -i divinacommediatxt -h http://localhost:9300 -q "dante AND virgi*"
> Searching for $dante AND virgi*
> "Dante, perché Virgilio se ne vada,
> "Dante, perché Virgilio se ne vada,

控制台应用程序使用该ConsoleLineParser库以人工方式解析输入。因此,我只为动词属性添加了两个类,并在控制台动词和要运行的代码之间添加了映射。

private static void Main(string[] args)
{object x = CommandLine.Parser.Default.ParseArguments<CreateOptions, SearchOptions>(args).MapResult((CreateOptions opts) => DoCreate(opts),(SearchOptions opts) => DoSearch(opts),errs => 1);
}

根据用户输入(搜索或创建)的动词,启动传递参数的相应过程。

如何写文件

写作部分很容易。实际上,对于Elasticsearch,有两种选择。使用低级框架,您可以获得弹性API的包装实现。这有助于避免手动绑定和组合JSON有效负载。但是,如果您想使用数据,NEST是一个不错的选择。NEST是高级框架,如果您是ORM的专家,那么这也就不足为奇了。

您只需要为要保存的文档创建类,并定义如何使用注释保存属性并调用save API。

我认为这不太复杂,听起来更像是一个常规例程。这是类定义的代码片段。在此示例中,我每个文档仅使用一个包含一行文本的字段。

public class LogDocument
{public Guid Id { get; set; } = Guid.NewGuid();public string Body { get; set; }
}

下一步是创建索引。在这一步中,我们将索引与类相关联。可以手动完成此操作,指定存储设置或使用自动映射。在我们的示例中,“Id”字段会自动映射到文档的唯一标识符。

client.Indices.Create(indexName, c => c.Map<LogDocument>(m => m.AutoMap<LogDocument>()));

最后,我们拥有代码中最愚蠢的部分:写入数据。因为我们要将所有诗句保存到许多文档中(每行一个),所以我们只是进行一次迭代。

string[] lines = File.ReadAllLines(filepath);int items = 0;
Parallel.ForEach(lines, (line) =>
{if (!string.IsNullOrWhiteSpace(line)){client.CreateDocument<LogDocument>(new LogDocument(){Body = line.Trim()});items++;}
});

请注意,通过外部系统使用API​​,我们可以使用并行构造来提高性能。

如何查询文件

这部分非常简单而且非常清楚——至少我希望如此。访问文档的基本方法是使用常规流利的LINQ语法。这是基本用法,我更愿意将这个演示集中在文档不太完善的搜索全文数据用例上。

Elastic允许使用原始查询来查找字段数据。为此,您可以使用正确的Search方法重载,配置原始查询:

var searchResponse = client.Search<LogDocument>(s => s.Size(10).Query(q => q.QueryString(qs => qs.Query(searchStr).AllowLeadingWildcard(true))));var docs = searchResponse.Documents;

获得什么

Elasticsearch是领先的搜索引擎解决方案。它为应用程序提供了诸如全文搜索或文档索引之类的丰富功能。它可以用作服务或内部部署。无论哪种情况,配置基本用法都非常简单。

NEST框架使我们可以像通过LINQ进行简单数据库存储和访问Elasticsearch一样,这使一切变得非常简单。

对于要让最终用户编写查询的复杂情况,可以使用原始查询并将结果映射到类。

资源资源

  • GitHub演示项目
  • 官方弹性搜索网站
  • 我在Medium上的原始文章

如何使用Elasticsearch在.NET应用程序中实现全文搜索相关推荐

  1. java程序示例_Java程序中的Google搜索示例

    java程序示例 Sometime back I was looking for a way to search Google using Java Program. I was surprised ...

  2. SQL Server中的全文搜索

    SQL Server中的全文搜索 一.概述 二.全文搜索查询 三.将全文搜索查询与 LIKE 谓词进行比较 四.全文搜索体系结构 4.1.SQL Server 进程 4.2.过滤器守护程序主机进程 五 ...

  3. MySQL 中的全文搜索(附示例)

    虽然 MySQL 不是一个功能齐全的文本搜索引擎,但它有足够的技巧可用于在您的应用程序中实现基本搜索功能.让我们快速浏览一下. 首先,让我们打开 mysql 提示并创建一个新的数据库并调用它resta ...

  4. SQLite中使用全文搜索FTS

    SQLite中使用全文搜索FTS SQLite支持全文搜索.通过全文搜索功能,可以方便用户快速进行查找.在iOS中,GRDB.FMDB等SQLite框架均支持FTS技术,如FTS3.FTS4等.各个框 ...

  5. 在Web应用程序中执行常见搜索场景的服务器端方法

    目录 介绍 例子 添加搜索模型 修改Home控制器 修改Home视图 介绍 应用程序中需要的一个常见场景是针对某个搜索值搜索数据模型.由于http协议的性质(无状态): 搜索结果的提交将再次呈现页面. ...

  6. Elasticsearch:一个方便易用的全文搜索库

    注:本文内容均来自<Elasticsearch权威指南>,是做读书笔记,同时做一个总结. Elasticsearch是使用基于http的RestFul来实现和使用的,因此使用curl来测试 ...

  7. 【ElasticSearch和whoosh实现项目中搜索功能】

    文章目录 说明: 一.单表搜索 二,全局搜索 方式一:haystack+whoosh+Jieba 方式二:haystack+ES 总结: 说明: 我们的项目中经常会遇到搜索的功能,最近也写过搜索的功能 ...

  8. 上传应用程序到谷歌商店_将Google图书搜索集成到PHP应用程序中

    上传应用程序到谷歌商店 常用缩略语 API:应用程序编程接口 DOM:文档对象模型 HTTP:超文本传输​​协议 HTML:超文本标记语言 ISBN:国际标准书号 REST:代表性状态转移 URL:统 ...

  9. ElasticSearch和whoosh实现项目中搜索功能

    搜索 自己最近总结了一下项目中实现过的搜索功能,接下来就通过具体的python项目来进行说明. 一.单表搜索 实现对于特定表中的某些字段的模糊搜索匹配,比如需要根据关键字搜索教师表中的授课教师或者所教 ...

最新文章

  1. day44前端开发1之html基础
  2. LeetCode 968. 监控二叉树
  3. appium 3 跑起来
  4. android 浏览文件夹,如何浏览android中的文件夹并获取所选文件夹的路径
  5. Python Flask web 项目零改动迁移至阿里云函数计算
  6. C语言 | 卡尔曼滤波算法2——算法分析
  7. 预加载显示图片的艺术
  8. 故事工程学:人工智能和程序化叙事生成
  9. c#语法之lock 语句
  10. springboot idea debug 模式下启动特别忙,且无法访问
  11. redis详解- 过期删除策略和内存淘汰策略
  12. [Java] 蓝桥杯BASIC-24 基础练习 龟兔赛跑预测
  13. 走近源码:Redis的启动过程
  14. Redis应用(四)——在Spring框架中的应用
  15. Android 反编译代码,资源修改,重新签名
  16. RecSys2020推荐系统论文Recommending the Video to Watch Next: An Offline and Online Evaluation at YOUTV.de
  17. 联想 计算机无线网络设置方法,在Windows XP下如何配置无线网络
  18. 微信小程序 实现提示弹窗
  19. ISO 8601规则
  20. 【翻译】和麻美学姐一起的世界树(マミさんと世界樹スレ)第二话

热门文章

  1. js java cookie_js cookie 工具
  2. 验证码识别算法_用Python机器学习搞定验证码
  3. linux+下c语言编程项目,精通UNIX下C语言编程与项目实践
  4. oracle12输出文件性能慢,输出选项 (Oracle Solaris Studio 12.2:性能分析器)
  5. 分式混合运算20道题_FAG剖分式调心滚子轴承的性能
  6. 多品类电商促销海报PSD分层模板,宠溺好物
  7. 秋季促销海报素材手机端模板,让打折季像诗一样
  8. 设计师必收藏!!!让你灵感迸发的配色网站
  9. UI素材干货|听说UI设计师更喜欢Sketch
  10. python爬火车票是不是违法_python利用selenium+requests+beautifulsoup爬取12306火车票信息...