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

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

asciidoc文件阅读

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

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

相关文章

专转本计算机专业录取分数线,2018江苏专转本各专业分数线一览!

原标题&#xff1a;2018江苏专转本各专业分数线一览&#xff01;2018江苏专转本分数线梳理018江苏专转本考试已过去四个月&#xff0c;分数线已经公布了三个多月。按照分数线进行梳理大致情况如下&#xff1a;300分以上院校专业常州大学的财务管理 320分独占鳌头。300分以上分数…

综合知识计算机类编制,天津事业编综合知识是什么

天津事业编综合知识有三类&#xff0c;分别是文字综合类、财会类、计算机类&#xff0c;考试时根据岗位考试要求进行一类综合知识的考核&#xff0c;均为主客观性试题&#xff0c;考试时限为150分钟&#xff0c;满分为100分。综合知识(文字综合类)简介(一)测试内容综合知识(文字…

哥大计算机科学学费,哥大计算机科学专业成功案例解析!!!

学生背景&#xff1a;学生&#xff1a;刘同学本科背景&#xff1a;北京大学 生物工程专业GPA: 3.5/4.0雅思7.5 GRE320录取院校&#xff1a;哥伦比亚大学—MS in Computer Science计算机科学硕士规划分析&#xff1a;1、背景分析L同学本科读的是生物工程专业&#xff0c;因为同学…

使用Spring Boot和React进行Bootiful开发

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 在过去的几年中&#xff0c;React受到了很多积极的报导&#xff0c;使其成为Java开发…

计算机硬盘按不同接口,硬盘接口不同 速度差别竟然这么大

硬盘接口是硬盘与主机系统间的连接部件&#xff0c;作用是在硬盘缓存和主机内存之间传输数据。不同的硬盘接口决定着硬盘与计算机之间的连接速度&#xff0c;在整个系统中&#xff0c;硬盘接口的类型以及好坏都会直接影响程序运行快慢。说到硬盘接口我们常见的有SATA、PCI-E、M…

计算机组成原理setb,计算机组成原理与汇编语言4

第四章指令系统指令系统概述指令系统是指某一种计算机所有指令的集合。对计算机而言&#xff0c;这是一组二进制数的输入&#xff0c;实际上是一组电平的输入。这些输入能在一个指令周期内产生人们预先规定的动作。显然这不是一组随机的二进制数据输入。指令系统是联系硬件和软…

你活在一个计算机模拟中吗,一麻省理工教授认为,我们更有可能生活在计算机模拟宇宙中...

一位麻省理工学院的教授表示&#xff0c;我们“更有可能”生活在某种模拟宇宙中&#xff0c;因为我们自己离能够创造超现实的模拟也不远了。(参见在接受解释性网站Vox采访时&#xff0c;计算机科学家Rizwan Virk认为&#xff0c;如果我们生活在信息世界而不是物质世界中&#x…

服务器系统开机提示0xc000007b,0xc000007b蓝屏解决方法

0xc000007b是一种常见的蓝屏代码&#xff0c;导致出现此蓝屏代码的原因有很多&#xff0c;BIOS设置问题&#xff0c;驱动问题&#xff0c;硬件问题等等。硬件问题对于我们小白来说解决起来有点困难。我给大家带来了解决0xc000007b蓝屏软件问题的方法&#xff0c;赶紧来瞧瞧吧0x…

tms tck_记录合规性–关于TCK,规格和测试

tms tck使用软件规格非常困难。 不论在哪个地方提出&#xff1b; 您最终遇到了一个大问题&#xff1a;是否已实现所有指定的内容并对其进行了测试&#xff1f; 在瀑布驱动的方法学时代&#xff0c;这一直是一个问题&#xff0c;即使在撰写本文的今天&#xff0c;敏捷性和用户故…

3D环动画css3实现,CSS3 3D酷炫立方体变换动画的实现

我爱撸码&#xff0c;撸码使我感到快乐&#xff01;大家好&#xff0c;我是Counter&#xff0c;本章微博主要利用了CSS3的一些新特性&#xff0c;主要用到关键帧来使3D图形运动起来&#xff0c;涉及到了一些抽象的思想&#xff0c;立体的想象。先给大家看看完成的效果&#xff…

Java的新视差控件(JavaFX)

介绍 视差是一种视觉效果&#xff0c;您可以组合以不同速度移动的两个分层图像以获得深度感。 想想一下&#xff0c;当您在道路上行驶时&#xff0c;您会看到附近的树木在快速移动&#xff0c;而距离较远的树木将沿相同的方向移动&#xff0c;但速度较慢&#xff0c;结果是您感…

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

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

手机推送信息到本地服务器,服务器信息推送到手机

服务器信息推送到手机 内容精选换一换服务器的计费方式为“包年/包月”&#xff0c;如果在计费周期内不想再继续使用&#xff0c;请参考本节指导进行退订。执行退订操作前&#xff0c;请确保待退订的服务器数据已完成备份或者迁移&#xff0c;退订完成后资源将被完全删除&#…

Apache Camel 2.21发布–新增功能

我们刚刚发布了Apache Camel 2.21&#xff0c;我将在此博客中重点介绍值得注意的更改。 此版本不支持Spring Boot2。对Spring Boot 2的支持将在Camel 2.22中提供&#xff0c; 我们计划在2018年夏季之前发布。 1&#xff09;处理大型JMS消息 我们在JMS组件中添加了更好的支持&…

linux下网站服务器,Linux下使用Apache搭建Web网站服务器(示例代码)

[[email protected] ~]# yum install elinks –y主配置文件[[email protected] ~]# ls/etc/httpd/conf/httpd.conf/etc/httpd/conf/httpd.conf#我们又是怎么知道httpd的注配置文件是在你那里的呢&#xff1f;查看httpd注配置文件位置[[email protected] ~]# rpm -pql/mnt/Packa…

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

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

服务器可以装两个系统吗,云服务器可以装多个系统吗

云服务器可以装多个系统吗 内容精选换一换示例&#xff1a;购买并登录Windows弹性云服务器示例&#xff1a;购买并登录Linux弹性云服务器云平台提供了多种实例类型供您选择&#xff0c;不同类型的实例可以提供不同的计算能力和存储能力。同一实例类型下可以根据CPU和内存的配置…

基于FPGA,如何用Verilog HDL实现64位宽的扰码器?附上仿真结果。

文章目录前言一、扰码器1、什么是扰码器2、扰码的原理3、产生扰码的多项式二、Scrambler的Verilog实现1、scrambler.v2、scrambler_tb.v三、仿真结果四、总结前言 在数字信号处理系统中&#xff0c;因为发送端的数字信号序列可能会出现很长一段都是“0”&#xff0c;或很长一段…

基于FPGA,解扰码器Verilog的实现,以及扰码器与解扰码器的联合仿真。附上仿真结果。

文章目录前言一、扰码器二、解扰码器三、Descrambler的Verilog实现1、descrambler.v2、descrambler_tb.v四、扰码器与解扰码器的联合仿真1、scrambler_test.v2、scrambler_test_tb.v3、联合仿真结果五、总结前言 在数字信号处理系统中&#xff0c;因为发送端的数字信号序列可能…

光纤通信系统简介

文章目录前言一、直接检测光通信系统二、相干光通信系统三、直接检测与相干检测1、直接检测2、相干检测3、相干检测的优缺点&#xff08;1&#xff09;相干检测的缺点&#xff08;2&#xff09;相干检测的优点总结参考文献前言 光通信系统的基本组成结构如下图所示。光通信系统…