
正文
倒排索引java代码 什么是倒排索引技术
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
JAVA编程问题求助 编写程序,把一个数组中的元素倒过来。例如原数组为1,2,3,4,5。则倒排
import java.util.*;
import static java.lang.System.*;
import static java.util.Arrays.*;
public class Test
{
public static void main(String[] args)
{
Integer[] array={1,2,3,4,5};
//数组工具类的排列方法,我开始尝试使用Lambda表达式但是失败了
sort(array,new ComparatorInteger()
{
public int compare(Integer a,Integer b)
{
//如果a大于b返回a小于b,反之亦然,造成倒序排列的效果
return ab?-1:ab?1:0;
}
});
//输出排列后的数组,输出"[5, 4, 3, 2, 1]"
out.println(Arrays.toString(array));
}
}
相关问答
Q1: java代码转时序图或抽象语义树 ,下面是java代码
System.Security.Cryptography.SHA512 shaM = new System.Security.Cryptography.SHA512Managed(); 是个类是.net的类,要java中也有相关类要自己去写。
Q2: 倒排索引
倒排索引(Inverted Index):
倒排索引从逻辑结构和基本思路上讲非常简单,下面我们通过具体实例来进行说明,使得大家能够对倒排索引有一个宏观而直接的感受。
中文和英文等语言不同,单词之间没有明确的分隔符号,所以首先要用分词系统将文档自动切分成单词序列,这样每个文档就转换为由单词序列构成的数据流。
为了系统后续处理方便,需要对每个不同的单词赋予唯一的单词编号,同时记录下哪些文档包含这个单词,在处理结束后,我们可以得到最简单的倒排索引(参考图4)。
图4中,“单词ID”一列记录了每个单词对应的编号,第2列是对应的单词,第3列即每个单词对应的倒排列表。比如:单词“谷歌”,其中单词编号为1,倒排列表为{1,2,3,4,5},说明文档集合中每个文档都包含了这个单词。
之所以说图4的倒排索引是最简单的,是因为这个索引系统只记载了哪些文档包含某个单词。而事实上,索引系统还可以记录除此之外的更多信息。
图5是一个相对复杂些的倒排索引,与图4所示的基本索引系统相比,在单词对应的倒排列表中不仅记录了文档编号,还记载了单词频率信息,即这个单词在某个文档中出现的次数。之所以要记录这个信息,是因为词频信息在搜索结果排序时,计算查询和文档相似度是一个很重要的计算因子,所以将其记录在倒排列表中,以方便后续排序时进行分值计算。
在图5所示的例子里,单词“创始人”的单词编号为7,对应的倒排列表内容有(3;1),其中3代表文档编号为3的文档包含这个单词,数字1代表词频信息,即这个单词在3号文档中只出现过1次,其他单词对应的倒排列表所代表的含义与此相同。
实用的倒排索引还可以记载更多的信息,图6所示的索引系统除了记录文档编号和单词词频信息外,额外记载了两类信息——即每个单词对应的文档频率信息(图6的第3列)及单词在某个文档出现位置的信息。
文档频率信息代表了在文档集合中有多少个文档包含某个单词,之所以要记录这个信息,其原因与单词频率信息一样,这个信息在搜索结果排序计算中是一个非常重要的因子。
而单词在某个文档中出现位置的信息并非索引系统一定要记录的,在实际的索引系统里可以包含,也可以选择不包含这个信息,之所以如此,是因为这个信息对于搜索系统来说并非必要,位置信息只有在支持短语查询的时候才能够派上用场。
以单词“拉斯”为例:其单词编号为8,文档频率为2,代表整个文档集合中有两个文档包含这个单词,对应的倒排列表为{(3;1;4),(5;1;4)},其含义为在文档3和文档5出现过这个单词,单词频率都为1,单词“拉斯”在这两个文档中的出现位置都是4,即文档中第4个单词是“拉斯”。
图6所示的倒排索引已经是一个非常完备的索引系统,实际搜索引擎的索引结构基本如此,区别无非是采取哪些具体的数据结构来实现上述逻辑结构。
有了这个索引系统,搜索引擎可以很方便地响应用户的查询。比如:用户输入查询词 “Facebook”,搜索系统查找倒排索引,从中可用读出包含这个单词的文档,这些文档就是提供给用户的搜索结果。
而利用单词词频信息、文档频率信息即可对这些候选搜索结果进行排序,计算文档和查询的相似性,按照相似性得分由高到低排序输出,此即为搜索系统的部分内部流程。
单词词典是倒排索引中非常重要的组成部分,它用来维护文档集合中出现过的 所有单词 的相关信息,同时用来记载某个 单词对应的倒排列表在倒排文件中的位置信息 。在支持搜索时,根据用户的查询词,去单词词典里查询,就能够获得相应的倒排列表,并以此作为后续排序的基础。
对于一个规模很大的文档集合来说,可能包含几十万甚至上百万的不同单词,能否快速定位某个单词,这直接影响搜索时的响应速度,所以需要高效的数据结构来对单词词典进行构建和查找, 常用的数据结构包括 哈希加链表 结构和 树形 词典结构。
B树(或者B+树)是另外一种高效查找结构,图8是一个 B树结构示意图。B树与哈希方式查找不同,需要字典项能够按照大小排序(数字或者字符序),而哈希方式则无须数据满足此项要求。
B树形成了层级查找结构,中间节点用于指出一定顺序范围的词典项目存储在哪个子树中,起到根据词典项比较大小进行导航的作用,最底层的叶子节点存储单词的地址信息,根据这个地址就可以提取出单词字符串。
具体的大家可以看看[ ;fps=1 )
Q3: Elasticsearch 倒排索引
之前我们已经了解过,Elasticsearch 是一个基于 Lucene 实现的分布式全文检索引擎,其实 Elasticsearch 倒排索引就是 Lucene 的倒排索引。数据检索是 ES 的一项核心功能,它的底层实现也是离不开倒排索引的,通过倒排索引技术可以提高数据的检索效率,理解倒排索引的原理很重要。
那什么是倒排索引,我们该如何理解它呢?
我们能进行数据检索的前提条件是,已经创建好了索引库,并给里边添加了文档数据。所以我们可以按照 创建索引库 、 添加文档 、 数据检索 这个顺序来认识倒排索引。
首先是创建索引库,我们之前已经安装好了 IK 分词器,这里我们创建一个 test 索引,它只有一个 content 字段,添加文档时字段的分词模式是 ik_max_word ,检索时关键字的分词模式是 ik_smart :
字段的分词模式会影响最终生成的倒排索引。不了解分词器的可以参考 Elasticsearch 中文分词器插件 。
创建好了索引,我们来添加一条文档数据:
添加文档数据时,ES 会根据字段的分词模式将字段的值拆分成多个 词条 (Term)(或者称作词项),创建索引库时我们指定了 content 字段分词模式为 ik_max_word ,则会生成如下的词条:
接下来就是建立倒排索引了,在这之前我们先了解两个概念 词条字典 (Term Dictionary)、 倒排列表 (Posting List):
ES 的倒排索引就是由 词条字典 和 倒排列表 两部分组成的。如下就是一个简易版的倒排索引,倒排列表项只有词条对应的文档 id:
一个词条对应一个倒排索引项。ES 会给每个字段都建立一个倒排索引。
我们再添加一条文档数据:
根据上边的原理,最终 content 字段的倒排索引会被更新成如下结构:
前边已经添加了文档数据,同时也生成了倒排索引,接下来就是检索数据了。在这之前还有一个知识点需要了解,那就是 词条索引 (Term Index),词条索引一般只存储各个 词条 的前缀(第一个字符),它和字条字典对应。之所以需要词条索引,是因为 词条字典 一般都很大,不适合保存在内存中而是存储在磁盘中,检索数据时根据关键字的前缀匹配到词条索引,再根据词条索引定位到关键字在倒排索引的词条字典中大致的位置,然后进一步在词条字典中通过二分查找定位到具体的词条,这样避免了直接遍历词条字典来点位词条,大幅减少了磁盘的读取,提高了效率。
定位到了词条,就能在倒排索引中找到对应的倒排列表项,进而就知道了对应的文档 id,有了文档 id 自然也就找到了文档,这也就是 ES 检索数据大致的原理。
如下我们查询包含 十二 的文档数据:
由于我们创建索引库时指定了检索时关键字的分词模式是 ik_smart ,所以 十二 被分词后还是 十二 ,再结合上边的原理,以 十二 为关键字最终可以查询到 id 为 1、2 的文档数据:
这篇最好能结合 Elasticsearch 中文分词器插件 一起看,这样能更容易理解些。
新手上路,不合理的地方还望大佬指点。
Q4: java请随机输入10个数字保存到List中,并按倒序显示出来
smile_bug 说的这个我还真没想过,想想觉得很行啊
找了手册,才知道java的list没tree的,懒得写个,汗
那只能二楼的方法
public static void main(final String[] args) {
final ListInteger integers = new ArrayListInteger();
final Scanner scanner = new Scanner(System.in);
for (int i = 1; i = 3; i++) {
try {
System.out.println("输入第" + i + "个数吧");
final int input = Integer.parseInt(scanner.next());
integers.add(input);
}
catch (final Throwable e) {
System.err.println("这不是个数字,我可是超级程序");
i--;
continue;
}
}
Collections.sort(integers);// 自然排
Collections.reverse(integers);// 倒排
for (final Integer integer : integers) {
System.out.println(integer);
}
}
Q5: java建大数据表
txt 大数据文件 对内存要求很大 机器配置要求也很大你可以把txt内容拷贝到excel 里试试
关于倒排索引java代码和什么是倒排索引技术的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







