「反向索引java」反向索引从最后一个开始,为什么最后一个不是0

博主:adminadmin 2022-12-03 13:51:05 66

本篇文章给大家谈谈反向索引java,以及反向索引从最后一个开始,为什么最后一个不是0对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java中的string用法

java中的string用法,可以到java api查找方法的使用方式:

class StringMethodDemo 

{

 public static void method_Zhuanhuan_Qukong_Bijiao()

 {

  String s = "     hello Java    ";

  

  //打印结果是:(hello和java前后门都有空格)hello java

  sop(s.toUpperCase());

  //打印结果是:(HELLO和JAVA前后门都有空格)HELLO JAVA

  sop(s.toLowerCase());

  //打印及结果是:不带空格的“hello java”

  sop(s.trim());

  //比较数的大写,打印结果是:1,因为b对应ascii值是98,

  //a对应是97,所以b-a=1

  String s1 = "abc";

  String s2 = "aaa";

  sop(s1.compareTo(s2));

 }

 public static void method_sub()

 {

  String s = "abcdef";

  //打印结果是:cdef,从指定位置开始到结尾。如果角标不存在,会出现字符串角标越界。

  sop(s.substring(2));

  //打印结果是:cd,包含头,不包含尾。

  sop(s.substring(2,4));

 }

 public static void method_split()

 {

  String s = "zhangsan,lisi,wangwu";

  String[] arr = s.split(",");

  for(int x=0; xarr.length; x++)

  {

   sop(arr[x]);

  }

 }

 public static void method_replace()

 {

  String s = "hello java";

  //String s1 = s.replace('a','n');

  //String s1 = s.replace('w','n');  如果要替换的字符不存在,返回的还是原串

  

  String s1 = s.replace("java","world");//打印结果是:hello world

  sop("s="+s); //打印结果是:hello java因为字符串一旦被初始化,值就不可被改变

  sop("s1="+s1);//打印结果是:hello jnvn

 }

 public static void method_trans()

 {

  char[] arr = {'a','b','c','d','e','f'};

  String s = new  String(arr,1,3);

  sop("s="+s);//打印结果是:bcd

  String s1 = "zxcvbnm";

  char[] chs = s1.toCharArray();

  for(int x=0; xchs.length; x++)

  {

   sop("ch="+chs[x]);//打印结果是:ch=z,x,c,v,b,n,m

  }

 }

 public static void method_is()

 {

  String str = "ArrayDemo.java";

 //判断文件名称是否是Array单词开头

  sop(str.startsWith("Array"));

 

 //判断文件名称是否是.java的文件

  sop(str.endsWith(".java"));

 

 //判断文件中是否包含Demo

  sop(str.contains("Demo"));

 }

 

 public static void method_get()

 {

  String str = "abcdeakpf";

  //长度

  sop(str.length());

  //根据索引获取字符

  sop(str.charAt(4));

  //sop(str.charAt(40));当访问到字符串中不存在的角标时会发生StringIndexOutOfBoundsException(字符串角标越界异常)

  //根据字符获取索引

  //sop(str.indexOf('a'));

  sop(str.indexOf('a',3));//打印的是5,因为角标3是d,

        //所以从d后面开始找a,第5个角标是a

  //sop(str.indexOf('t',3))打印:-1,如果没有找到角标,返回-1

  

  //反向索引一个字符出现的位置(从右往左查找,但是角标还是从左开始)

  sop(str.lastIndexOf("a"));

 }

 public static void main(String[] args) 

 {

   method_Zhuanhuan_Qukong_Bijiao();

  //method_sub();

  //method_split();

  //method_replace();  

  //method_trans(); 

  //method_is();

  //method_get();

  /*

  String s1 = "abc";

  String s2 = new String("abc");

  String s3 = "abc";

  System.out.println(s1==s2);

  System.out.println(s1==s3);

  */

 }

 public static void sop(Object obj)

 {

  System.out.println(obj);

 }

}

正向索引与反向索引(solr)

正向索引(正排索引) :正排表是以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档。

正排表结构如图1所示,这种组织方法在建立索引的时候结构比较简单,建立比较方便且易于维护;因为索引是基于文档建立的,若是有新的文档加入,直接为该文档建立一个新的索引块,挂接在原来索引文件的后面。若是有文档删除,则直接找到该文档号文档对应的索引信息,将其直接删除。但是在查询的时候需对所有的文档进行扫描以确保没有遗漏,这样就使得检索时间大大延长,检索效率低下。

尽管 正排表的工作原理非常的简单 ,但是由于其检索效率太低,除非在特定情况下,否则实用性价值不大。

反向索引(倒排索引) :倒排表以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档,一个表项就是一个字表段,它记录该文档的ID和字符在该文档中出现的位置情况。

由于每个字或词对应的文档数量在动态变化,所以倒排表的建立和维护都较为复杂,但是在查询的时候由于可以一次得到查询关键字所对应的所有文档,所以效率高于正排表。在全文检索中,检索的快速响应是一个最为关键的性能,而索引建立由于在后台进行,尽管效率相对低一些,但不会影响整个搜索引擎的效率。 倒排表的结构图如图2:

java中string怎么使用

以下是关于string的七种用法,注意哦,记得要时常去查看java的API文档,那个里面也有很详细的介绍

1获取

1.1:字符串中包含的字符数,也就是字符串的长度。

int length():获取长度

1.2:根据位置获取位置上某个字符。

char charAt(int index)

1.3:根据字符获取该字符在字符串中的位置。

int indexOf(int ch):返回的是ch在字符串中第一次出现的位置。

int indexOf(int ch,int fromIndex):从fromIndex指定位置开始,获取ch在字符串中出现的位置。

int indexOf(String str):返回的是str在字符串中第一次出现的位置。

int indexOf(String str,int fromIndex):从fromIndex指定位置开始,获取str在字符串中出现的位置。

1.4:int lastIndexOf(String str):反向索引。

2判断

2.1:字符串中是否包含某一个子串。

boolean contains(str);

特殊之处:indexOf(str):可以索引str第一次出现为止,如果返回-1,表示该str不在字符串中存在。

所以,也可以用于对指定判断是否包含。

if(str.indexOf("a")!=1)

而且该方法既可以判断,也可以获取出现的位置。

2.2:字符串中是否有内容。

boolean isEmpty():原理就是判断长度是否为0。

2.3:字符串是否以指定内容开头。

boolean startsWith(str);

2.4:字符串是否以指定内容结尾。

boolean endsWith(str);

2.5:判断字符内容是否相同,复写了object类中的equals方法。

boolean equals(str);

2.6:判断内容是否相同,并忽略大小写。

boolean.equalsIgnorecase();

3转换

3.1:将字符数组转成字符串。

构造函数:String(char[])

String(char[],offset,count):将字符数组中的一部分转成字符串

静态方法:

static String copyValueOf(char[]);

static String copyValueOf(char[] data,int offset,int count);

static String valueOf(char[]);

3.2:将字符串转成字符组

char[] tocharArray();

3.3:将字节数组转成字符串。

String(byte[])

String(byte[],offset,count):将字节数组中的一部分转成字符串

3.4:将字符串转成字节数组。

byte[] getBytes()

3.5:将基本数据类型转成字符串,

static String valueOf(int)

static String valueOf(double)

// 3+"" 与 String.valueOf(3)的值是一样的

特殊:字符串和字节数组在转换过程中,是可以指定编码的。

4替换

String replace(oldchar,newchar);

5切割

String[] split(regex);

6子串。获取字符串中的而一部分

String subString(begin);

String subString(begin,end);

7转换,去除空格,比较。

7.1:将字符串转成大写或小写

String toUpperCsae() 大转小

String toLowerCsae() 小转大

7.2:将字符串两端的多个空格去除

String trim();

7.3:对两个字符串进行自然顺序的比较

int compareTo(string);

请看如下代码,下面的代码都是针对上面string七种用法而进行一一举例说明:

复制代码 代码如下:

class StringMethodDemo

{

public static void method_Zhuanhuan_Qukong_Bijiao()

{

String s = " hello Java ";

//打印结果是:(hello和java前后门都有空格)hello java

sop(s.toUpperCase());

//打印结果是:(HELLO和JAVA前后门都有空格)HELLO JAVA

sop(s.toLowerCase());

//打印及结果是:不带空格的“hello java”

sop(s.trim());

//比较数的大写,打印结果是:1,因为b对应ascii值是98,

//a对应是97,所以b-a=1

String s1 = "abc";

String s2 = "aaa";

sop(s1.compareTo(s2));

}

public static void method_sub()

{

String s = "abcdef";

//打印结果是:cdef,从指定位置开始到结尾。如果角标不存在,会出现字符串角标越界。

sop(s.substring(2));

//打印结果是:cd,包含头,不包含尾。

sop(s.substring(2,4));

}

public static void method_split()

{

String s = "zhangsan,lisi,wangwu";

String[] arr = s.split(",");

for(int x=0; xarr.length; x++)

{

sop(arr[x]);

}

}

public static void method_replace()

{

String s = "hello java";

//String s1 = s.replace('a','n');

//String s1 = s.replace('w','n'); 如果要替换的字符不存在,返回的还是原串

String s1 = s.replace("java","world");//打印结果是:hello world

sop("s="+s); //打印结果是:hello java因为字符串一旦被初始化,值就不可被改变

sop("s1="+s1);//打印结果是:hello jnvn

}

public static void method_trans()

{

char[] arr = {'a','b','c','d','e','f'};

String s = new String(arr,1,3);

sop("s="+s);//打印结果是:bcd

String s1 = "zxcvbnm";

char[] chs = s1.toCharArray();

for(int x=0; xchs.length; x++)

{

sop("ch="+chs[x]);//打印结果是:ch=z,x,c,v,b,n,m

}

}

public static void method_is()

{

String str = "ArrayDemo.java";

//判断文件名称是否是Array单词开头

sop(str.startsWith("Array"));

//判断文件名称是否是.java的文件

sop(str.endsWith(".java"));

//判断文件中是否包含Demo

sop(str.contains("Demo"));

}

public static void method_get()

{

String str = "abcdeakpf";

//长度

sop(str.length());

//根据索引获取字符

sop(str.charAt(4));

//sop(str.charAt(40));当访问到字符串中不存在的角标时会发生StringIndexOutOfBoundsException(字符串角标越界异常)

//根据字符获取索引

//sop(str.indexOf('a'));

sop(str.indexOf('a',3));//打印的是5,因为角标3是d,

//所以从d后面开始找a,第5个角标是a

//sop(str.indexOf('t',3))打印:-1,如果没有找到角标,返回-1

//反向索引一个字符出现的位置(从右往左查找,但是角标还是从左开始)

sop(str.lastIndexOf("a"));

}

public static void main(String[] args)

{

method_Zhuanhuan_Qukong_Bijiao();

//method_sub();

//method_split();

//method_replace();

//method_trans();

//method_is();

//method_get();

/*

String s1 = "abc";

String s2 = new String("abc");

String s3 = "abc";

System.out.println(s1==s2);

System.out.println(s1==s3);

*/

}

public static void sop(Object obj)

{

System.out.println(obj);

}

}

Elasticsearch是什么?

Elasticsearch是一个分布式文档存储。Elasticsearch存储的是序列化为JSON文档的复杂数据结构,而不是以列行数据的形式存储信息。当集群中有多个Elasticsearch节点时,存储的文档分布在整个集群中,可以立即从任何节点访问。

当存储文档时,它几乎是实时的——在1秒内就可以被索引和完全搜索。Elasticsearch使用了一种名为反向索引的数据结构,它支持非常快速的全文搜索。反向索引列出任何文档中出现的每个惟一单词,并标识每个单词出现的所有文档。

可以将索引看作是文档的优化集合,每个文档是字段的集合,这些字段是包含数据的键值对。默认情况下,Elasticsearch对每个字段中的所有数据进行索引,每个索引字段都有一个专用的、优化的数据结构。例如,文本字段存储在倒排索引中,数字和地理字段存储在BKD树中。使用每个字段的数据结构来组装和返回搜索结果的能力是Elasticsearch如此快速的原因

Elasticsearch还具有无模式的能力,这意味着可以对文档进行索引,而不必显式地指定如何处理文档中可能出现的每个不同字段。当动态映射被启用时,Elasticsearch会自动检测并向索引添加新的字段。这种默认行为使得创建索引和浏览数据变得很容易——只要开始创建索引文档,Elasticsearch就会检测布尔值、浮点值和整数值、日期和字符串,并将它们映射到合适的Elasticsearch数据类型。

但是,最终,您比Elasticsearch更了解您的数据以及您想如何使用它。您可以定义规则来控制动态映射,并显式地定义映射来完全控制字段的存储和索引方式。

定义您自己的映射使您能够:

为不同的目的以不同的方式为同一个字段建立索引通常是很有用的。例如,您可能希望将字符串字段索引为全文搜索的文本字段和用于排序或聚合数据的关键字字段。或者,您可以选择使用多个语言分析器来处理包含用户输入的字符串字段的内容

在索引期间应用于全文字段的分析链也在搜索时使用。当查询全文字段时,在索引中查找术语之前,查询文本会进行相同的分析。

虽然您可以使用Elasticsearch作为文档存储和检索文档及其元数据,但它的真正强大之处在于能够轻松访问构建在Apache Lucene搜索引擎库上的全套搜索功能。

Elasticsearch提供了一个简单、一致的REST API,用于管理集群、索引和搜索数据。出于测试目的,您可以直接从命令行或通过Kibana中的Developer Console轻松地提交请求。在应用程序中,您可以使用Elasticsearch客户端来选择语言:Java、JavaScript、Go、. net、PHP、Perl、Python或Ruby。

Elasticsearch REST api支持结构化查询、全文查询和结合这两种查询的复杂查询。结构化查询类似于您可以在SQL中构造的查询类型。例如,您可以在雇员索引中搜索性别和年龄字段,并根据hire_date字段对匹配项进行排序。全文查询查找与查询字符串匹配的所有文档,并根据相关度(它们与搜索词的匹配程度)返回它们。

除了搜索单个术语外,您还可以执行短语搜索、相似度搜索和前缀搜索,并获得自动补全建议。

是否有想要搜索的地理空间数据或其他数字数据?Elasticsearch在优化的数据结构中对非文本数据进行索引,支持高性能的地理和数字查询。

您可以使用Elasticsearch的全面的json风格的查询语言(query DSL)访问所有这些搜索功能。您还可以构造SQL风格的查询来在Elasticsearch内部本地搜索和聚合数据,JDBC和ODBC驱动程序允许许多第三方应用程序通过SQL与Elasticsearch交互。

Elasticsearch聚合使您能够构建复杂的数据总结,并洞察关键指标、模式和趋势。不只是寻找众所周知的“大海捞针”,聚合使您能够回答这样的问题:

您还可以使用聚合来回答更微妙的问题,例如

因为聚合利用了用于搜索的相同数据结构,所以它们也非常快。这使您能够实时分析和可视化数据。您的报告和仪表板会随着数据的更改而更新,因此您可以根据最新的信息采取行动。

What’s more, aggregations operate alongside search requests. You can search documents, filter results, and perform analytics at the same time, on the same data, in a single request. And because aggregations are calculated in the context of a particular search, you’re not just displaying a count of all size 70 needles, you’re displaying a count of the size 70 needles that match your users' search criteria—for example, all size 70 non-stick embroidery needles

Elasticsearch始终可用,并可根据您的需求进行扩展。它通过自然分配来做到这一点。您可以将服务器(节点)添加到集群中以增加容量,Elasticsearch会自动将您的数据和查询负载分布到所有可用的节点上。Elasticsearch不需要彻底检查应用程序,它知道如何平衡多节点集群以提供规模化和高可用性。节点越多越快乐

这是如何工作的呢?实际上,Elasticsearch索引只是一个或多个物理碎片的逻辑分组,其中每个碎片实际上是一个自包含的索引。通过将索引中的文档分布到多个分片上,并将这些分片分布到多个节点上,Elasticsearch可以确保冗余,既可以防止硬件故障,又可以随着节点添加到集群中而增加查询容量。随着集群的增长(或收缩),Elasticsearch会自动迁移碎片来重新平衡集群

有两种类型的分片:基本分片和复制分片。索引中的每个文档都属于一个主分片。复制分片是主分片的副本。副本提供数据的冗余副本,以防止硬件故障,并增加服务读取请求(如搜索或检索文档)的容量。

索引中主分片的数量在索引创建时是固定的,但是复制分片的数量可以在不中断索引或查询操作的情况下随时改变。

关于分片大小和为索引配置的主分片数量,有许多性能方面的考虑和权衡。碎片越多,维护这些索引的开销就越大。碎片的大小越大,当Elasticsearch需要重新平衡集群时,移动碎片所需的时间就越长。

查询大量的小分片可以使每个分片的处理速度更快,但是查询越多意味着开销越大,因此查询少量的大分片可能会更快。总之,这要看情况。

为您的用例确定最佳配置的最佳方法是通过使用您自己的数据和查询进行测试。

出于性能原因,集群内的节点需要位于同一个网络上。在不同数据中心的节点之间平衡集群中的分片花费的时间太长了。但是高可用性架构要求您避免把所有鸡蛋放在一个篮子里。当一个位置发生重大故障时,另一个位置的服务器需要能够接管。无缝。答案吗?Cross-cluster复制(CCR)。

CCR提供了一种从主集群自动同步索引到可作为热备份的辅助远程集群的方法。如果主集群故障,辅助集群可以接管。您还可以使用CCR创建辅助集群,以服务于与用户地理位置相近的读请求。

跨集群复制是主备复制。主集群上的索引是活动领导索引,并处理所有写请求。复制到次要集群的索引是只读的追随者。

与任何企业系统一样,您需要工具来保护、管理和监视您的Elasticsearch集群。安全、监控和管理特性集成到Elasticsearch中,使您能够使用Kibana作为管理集群的控制中心。数据汇总和索引生命周期管理等特性可以帮助您随着时间的推移智能地管理数据

关于反向索引java和反向索引从最后一个开始,为什么最后一个不是0的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-12-03,除非注明,否则均为首码项目网原创文章,转载请注明出处。