可搜索的文件? 是的你可以。 选择AsciiDoc的另一个原因

Elasticsearch是一个基于Apache Lucene的灵活,功能强大的开源,分布式实时云搜索和分析引擎,可提供全文搜索功能。 它是面向文档且无架构的。

Asciidoctor是一个纯Ruby处理器,用于将AsciiDoc源文件和字符串转换为HTML 5DocBook 4.5和其他格式。 除了Asciidoctor Ruby部分之外,还有一个Asciidoctor-java-integration项目,该项目使我们可以从Java调用Asciidoctor函数,而无需注意正在执行Ruby代码。

在这篇文章中,我们将了解如何在AsciiDoc文档上使用Elasticsearch ,以使其可通过其标题信息或内容进行搜索。

让我们添加所需的依赖项:

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>com.googlecode.lambdaj</groupId><artifactId>lambdaj</artifactId><version>2.3.3</version></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>0.90.1</version></dependency><dependency><groupId>org.asciidoctor</groupId><artifactId>asciidoctor-java-integration</artifactId><version>0.1.3</version></dependency></dependencies>

Lambdaj库用于将AsciiDoc文件转换为json文档。

现在我们可以启动一个Elasticsearch实例,在我们的例子中,它将是一个嵌入式实例。

node = nodeBuilder().local(true).node();

下一步是解析AsciiDoc文档标题,读取其内容并将其转换为json文档。

存储在Elasticsearch中json文档的示例可以是:

{"title":"Asciidoctor Maven plugin 0.1.2 released!","authors":[{"author":"Jason Porter","email":"example@mail.com"}],"version":null,"content":"= Asciidoctor Maven plugin 0.1.2 released!.....","tags":["release","plugin"]
}

而对于一个AsciiDoc文件转换成JSON文件,我们将使用由Elasticsearch 的Java API提供了以编程方式创建JSON文件XContentBuilder类。

package com.lordofthejars.asciidoctor;import static org.elasticsearch.common.xcontent.XContentFactory.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;import org.asciidoctor.Asciidoctor;
import org.asciidoctor.Author;
import org.asciidoctor.DocumentHeader;
import org.asciidoctor.internal.IOUtils;
import org.elasticsearch.common.xcontent.XContentBuilder;import ch.lambdaj.function.convert.Converter;public class AsciidoctorFileJsonConverter implements Converter<File, XContentBuilder> {private Asciidoctor asciidoctor;public AsciidoctorFileJsonConverter() {this.asciidoctor = Asciidoctor.Factory.create();}public XContentBuilder convert(File asciidoctor) {DocumentHeader documentHeader = this.asciidoctor.readDocumentHeader(asciidoctor);XContentBuilder jsonContent = null;try {jsonContent = jsonBuilder().startObject().field("title", documentHeader.getDocumentTitle()).startArray("authors");Author mainAuthor = documentHeader.getAuthor();jsonContent.startObject().field("author", mainAuthor.getFullName()).field("email", mainAuthor.getEmail()).endObject();List<Author> authors = documentHeader.getAuthors();for (Author author : authors) {jsonContent.startObject().field("author", author.getFullName()).field("email", author.getEmail()).endObject();}jsonContent.endArray().field("version", documentHeader.getRevisionInfo().getNumber()).field("content", readContent(asciidoctor)).array("tags", parseTags((String)documentHeader.getAttributes().get("tags"))).endObject();} catch (IOException e) {throw new IllegalArgumentException(e);}return jsonContent;}private String[] parseTags(String tags) {tags = tags.substring(1, tags.length()-1);return tags.split(", ");}private String readContent(File content) throws FileNotFoundException {return IOUtils.readFull(new FileInputStream(content));}}

基本上,我们通过调用startObject方法来启动新对象, field方法来添加新字段以及startArray来启动数组来构建json文档。 然后,将使用此生成器以json格式呈现等效对象。 请注意,我们使用的是从Asciidoctor类返回头从AsciiDoc文件属性没有阅读和渲染整个文档readDocumentHeader方法。 最后,内容字段设置为所有文档内容。

现在我们准备开始为文档建立索引。 注意populateData方法接收一个Client对象作为参数。 该对象来自Elasticsearch Java API ,表示与Elasticsearch数据库的连接。

import static ch.lambdaj.Lambda.convert;
//....private void populateData(Client client) throws IOException {List<File> asciidoctorFiles = new ArrayList<File>() {{add(new File("target/test-classes/java_release.adoc"));add(new File("target/test-classes/maven_release.adoc"));}};List<XContentBuilder> jsonDocuments = convertAsciidoctorFilesToJson(asciidoctorFiles);for (int i=0; i < jsonDocuments.size(); i++) {client.prepareIndex("docs", "asciidoctor", Integer.toString(i)).setSource(jsonDocuments.get(i)).execute().actionGet();}client.admin().indices().refresh(new RefreshRequest("docs")).actionGet();
}private List<XContentBuilder> convertAsciidoctorFilesToJson(List<File> asciidoctorFiles) {return convert(asciidoctorFiles, new AsciidoctorFileJsonConverter());
}

重要的是要注意,算法的第一部分是通过使用先前的转换器类和Lambdaj项目的convert方法所有我们的AsciiDoc文件(在本例中为两个)转换为XContentBuilder实例。

如果您愿意,可以在https://github.com/asciidoctor/asciidoctor.github.com/blob/develop/news/asciidoctor-java-integration-0-1-3-中查看本示例中使用的两个文档。 release.adoc和https://github.com/asciidoctor/asciidoctor.github.com/blob/develop/news/asciidoctor-maven-plugin-0-1-2-released.adoc 。

下一部分是在一个索引中插入文档。 这是通过使用prepareIndex方法完成的,该方法需要一个索引名称( docs ),一个索引类型( asciidoctor )和要插入的文档的ID 。 然后我们调用setSource方法,该方法将XContentBuilder对象转换为json ,最后通过调用execute()。actionGet() ,将数据发送到数据库。

仅由于我们使用的是Elasticsearch的嵌入式实例(在生产中不需要此部分),才需要最后一步,该实例通过调用refresh方法刷新索引。

之后,我们可以开始查询Elasticsearch以从我们的AsciiDoc文档中检索信息。

让我们从一个非常简单的示例开始,该示例返回所有插入的文档:

SearchResponse response = client.prepareSearch().execute().actionGet();

接下来,我们将搜索Alex Soto编写的所有文档,在本例中是其中一个。

import static org.elasticsearch.index.query.QueryBuilders.matchQuery;
//....
QueryBuilder matchQuery =  matchQuery("author", "Alex Soto");QueryBuilder matchQuery =  matchQuery("author", "Alexander Soto");

请注意,我正在搜索字段作者字符串Alex Soto ,该字符串仅返回一个。 另一个文档由Jason编写。 但是有趣的是,如果您搜索Alexander Soto ,那么将返回相同的文档。 Elasticsearch非常聪明,可以知道AlexAlexander是非常相似的名字,因此它也返回了文档。

更多查询,如何查找由Alex而不是Soto撰写的文档。

import static org.elasticsearch.index.query.QueryBuilders.fieldQuery;//....QueryBuilder matchQuery =  fieldQuery("author", "+Alex -Soto");

在这种情况下,当然不会返回任何结果。 请注意,在这种情况下,我们使用字段查询而不是术语查询,并且使用+和–符号来排除和包括单词。

您也可以找到所有包含title上 释放的单词的文档。

import static org.elasticsearch.index.query.QueryBuilders.matchQuery;//....QueryBuilder matchQuery =  matchQuery("title", "released");

最后,让我们找到所有谈论0.1.2版本的文档,在这种情况下,只有一个文档谈论它,另一个文档谈论0.1.3。

QueryBuilder matchQuery = matchQuery("content", "0.1.2");

现在我们只需要将查询发送到Elasticsearch数据库即可,这是通过使用prepareSearch方法完成的。

SearchResponse response = client.prepareSearch("docs").setTypes("asciidoctor").setQuery(matchQuery).execute().actionGet();SearchHits hits = response.getHits();for (SearchHit searchHit : hits) {System.out.println(searchHit.getSource().get("content"));
}

请注意,在这种情况下,我们通过控制台打印AsciiDoc内容,但是您可以使用asciidoctor.render(String content,Options options)方法将内容呈现为所需格式。

因此,在本文中,我们看到了如何使用Elasticsearch为文档建立索引,如何使用Asciidoctor-java-integration项目AsciiDoc文件中获取一些重要信息,以及最后如何对插入的文档执行一些查询。 当然, Elasticsearch中还有更多种查询,但是本文的目的并不是要探索Elasticsearch的所有可能性。

另外,请注意使用AsciiDoc格式编写文档有多么重要。 您无需花费太多精力就可以为文档建立搜索引擎。 另一方面,请设想使用任何专有的二进制格式(例如Microsoft Word)来实现相同的所有代码 因此,我们已经说明了使用AsciiDoc而不是其他格式的另一个原因。

参考: 可搜索的文件? 是的你可以。 从我们的JCG合作伙伴 Alex Soto 选择 “ One Jar To Rule All All”博客的另一个原因 。

翻译自: https://www.javacodegeeks.com/2013/06/searchable-documents-yes-you-can-another-reason-to-choose-asciidoc.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jquery 获取table当前行内容

$("a[namecheckOriginal]").click(function () { var parent $(this).parent().parent().find("td"); var moduleEnum parent.eq(7).text(); if(moduleEnum""){ } alert(moduleEnmu);}); 转载于:https://www.cnblogs.com/austi…

监视和检测Java应用程序中的内存泄漏

因此&#xff0c;您的应用程序内存不足&#xff0c;您日夜不停地分析应用程序&#xff0c;以期捕获对象中的内存漏洞。 后续步骤将说明如何监视和检测您的内存泄漏&#xff0c;以确保您的应用程序安全。 1.怀疑内存泄漏 如果您怀疑有内存泄漏&#xff0c;可以使用一种方便的方…

点a链接写邮件小技巧

无意间发现这个技巧&#xff0c;分享一下&#xff01; 当点击mailto的邮件链接的时候&#xff0c;需要填写标题和内容&#xff0c;如果你想规定一个邮件标题格式&#xff0c;那这个可以帮助你。 代码&#xff1a; <a href"mailto:haozidaqianduan.com?subject投稿&a…

javascript 分时函数 分批次添加DOM节点 timeChunk

创建1000个webqq的qq好友列表, 一个好友用一个节点来表示 * timeChunk var timeChunk function(a, fn, sz, done) {var obj, t, len a.length;var start function() {for (var i 0; i < Math.min(sz || 1, a.length); i) {var obj a.shift();fn.call(this, obj);}}retu…

uvm 形式验证_这究竟属于下一代验证的方法、语言还是工具?||路科验证

来源&#xff1a;内容由 公众号 路科验证 &#xff08;ID&#xff1a;Rocker-IC&#xff09;编辑部 原创&#xff0c;谢谢&#xff01;首先声明&#xff0c;便携式激励标准(PortableStimulus Standard, PSS)不是一种方法论&#xff0c;而是一种语言。使用语言我们可以有序地传递…

redis 版的 hello world

为 redis 添加一个命令&#xff0c;效果如下图&#xff1a; 在 Server.h 中加入命令处理函数的声明&#xff1a; void meCommand(client *c); 在 Server.c 的命令表中加入&#xff1a; struct redisCommand redisCommandTable[] {{"me",meCommand,1,"rF",…

unity中单位是米还是厘米_401场地清理是什么,由施工单位做还是甲方做?造价中如何体现?...

场地清理是对公路用地范围及借土场范围内施工场地的清理、拆除和挖掘&#xff0c;以及必要的平整场地等有关作业。一、工作内容根据路基工程项目分表可以看出场地清理主要包括三方面内容&#xff1a;1、清理与拆除(1)清除表土路基范围内的树根、腐殖土、草皮或地表土不符合路基…

华为鸿蒙系统是否上线,华为官方:鸿蒙系统2.0上线,手机能否搭载鸿蒙操作系统?...

原标题&#xff1a;华为官方&#xff1a;鸿蒙系统2.0上线&#xff0c;手机能否搭载鸿蒙操作系统&#xff1f;华为官宣鸿蒙已经过去有一年多的时间了。近日有消息称&#xff0c;在今年九月份华为即将举办开发者大会&#xff0c;届时正式发布鸿蒙2.0操作系统&#xff0c;相比之前…

图解 继电器模组接线图_交流接触器,继电器的知识你了解多少?(值得收藏)...

↑↑↑↑↑领取福利的小伙伴&#xff0c;先点击上方关注我们哦(文章字体较小&#xff0c;请点击放大后查看)交流接触器(Alternating Current Contactor)广泛用作电力的开断和控制电路。型号与参数交流接触器的型号很多&#xff0c; CJ0、CJ10系列交流接触器较为常用&#xff0c…

折线图表android,Android 折线图表MPAndroidChart的实现

昨日夜观天象&#xff0c;今日忽见北斗星陨落&#xff0c;《Android 折线图表》应运而生。single.pngmany.png一.本篇采用MPAndroidChart&#xff0c;大体实现步骤可分为两步&#xff1a;1.配置基本属性(包括X,Y轴)2.设置折线数据并添加复制代码二. 第一步&#xff0c;配置基本…

我最喜欢的Java高级开发人员书籍

我上一篇博客文章 &#xff08;我对高级Java开发人员的十个最喜欢的在线资源&#xff09;的想法是由Xiaoran Wang发表的针对高级Java开发人员的十大网站的启发。 Wang还写了一篇名为《面向Java高级开发人员的十大书籍》的文章。 正如关于高级Java开发人员的最佳网站上的帖子一样…

pyplot绘制图片_matplotlib系列之pyplot

pyplot对象包含了一系列用于绘图的函数&#xff0c;使得它工作起来就像MATLIB一样。它的功能例如&#xff1a;创建一个figure对象绘制一片绘图区域在区域中绘制线条或者点也可以绘制labels使用pyplot对象快速的生成一幅图片import matplotlib.pyplot as pltplt.subplot(121)plt…

字符串-----KMP竟然是18禁

今天学了一下午字符串&#xff0c;讲到结束也没讲KMP。有人问老师为什么不讲&#xff0c;老师来一句&#xff1a;字符串noip不考&#xff0c;而且还是18禁&#xff0c;自然不讲。【手动滑稽】 所以我也不讲。【微笑】 1.表达式树 表示35*8 最后计算的符号是根节点&#xff0c;是…

里bl2和bl3为什么分开_英国的水池为什么有两个水龙头?为什么英国有独立的冷热水龙头?...

如果大家看过我之前的文章&#xff0c;可能会有点映像&#xff0c;前面有提到过英国的双水龙头&#xff0c;有兴趣的朋友们可以点后面的直达链接查看&#xff1a;为什么在英国留学会掉头发&#xff1f;怎么办&#xff1f;英国的自来水&#xff08;冷水&#xff09;可以直接喝吗…

三剑客 老大:awk命令用法

awk是一种编程语言&#xff0c;用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一 个或多个文件&#xff0c;或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能&#xff0c;是linux/unix下的一个强大编程工具。它在命令行中使用&…

Mockito –带有注释和静态方法的额外接口

在代码中&#xff0c;我最近遇到了一段非常糟糕的代码&#xff0c;这些代码基于对对象执行某些操作的类转换。 当然&#xff0c;代码需要重构&#xff0c;但是如果您首先没有对该功能进行单元测试&#xff0c;则有时您可能无法做到/或者不想这样做&#xff08;这应该是可以理解…

怎么把原来的墙拆掉_家装拆除不是简单的砸砸墙,它也是有技术的

装修拆除中有很多人认为&#xff0c;拆除施工没有什么技术含量&#xff0c;感觉就像小品演的那样&#xff0c;挥挥大锤砸砸墙就可以了。所以有的人图便宜就从马路上随便找的工人来砸墙&#xff0c;他们不管是不是承重墙&#xff0c;只要业主要求他们就敢咋&#xff0c;后果真有…

20180209-os模块

下面将学习关于os模块的相关操作 项目练习的目录结构如下&#xff1a;所有的操作都是基于os_exercise.py模块 1.获取当前的Python脚本的工作目录路径 os.getcwd() # 1.获取当前目录 dir os.getcwd() print(获取当前python脚本工作目录:,dir) # 输出 # 获取当前python脚本工作目…

关于IE6.7.8.FF兼容的问题

所有浏览器 通用 height: 100px; IE6 专用 _height: 100px;IE6 专用 *height: 100px; IE7 专用 * height: 100px; IE7、FF 共用 height: 100px !important; 一、CSS 兼容 以下两种方法几乎能解决现今所有兼容. 1, !important (不是很推荐&#xff0c;用下面的一种感觉最安…

冯珊珊_模拟器企业衡泰信签约冯珊珊,推动高尔夫运动下沉

9月21日&#xff0c;著名高尔夫模拟器企业衡泰信宣布签约中国高尔夫球员冯珊珊&#xff0c;双方正式达成全面战略合作&#xff0c;旨在共同推动室内高尔夫运动的普及与推广&#xff0c;让更多人参与并喜爱上这项运动&#xff0c;推动全民健身目标&#xff0c;借助互联网、智慧场…