Solr 索引

 

索引是以系统的方式管理文档或其他实体。为了在文档中定位信息,我们使用索引。

索引可用于收集、解析和存储文档。

当我们查找所需文档时,它可用于提高搜索查询的速度和性能。

Solr 索引过程概述

Apache Solr 中的索引过程分为三个基本任务:

将文档从其原生格式(例如 XML 或 JSON)转换为 Solr 支持的格式。

使用多个定义良好的 Solr 接口之一添加文档,例如 HTTP POST。

Apache Solr 可以配置为在编制索引时对文档中的文本应用转换。

下图提供了在 Solr 中索引文档的三个必要步骤的高级概述。

Apache Solr 中的索引

Solr 支持我们文档的不同索引格式,包括 JSON、XML 和 CSV。在上图中,我们选择了 XML,因为 XML 的自描述格式使其易于适应和理解。以下是示例,我们的推文使用 Solr XML 格式时的外观。

<add>
<doc>
<field name=

"id"

>1</field>
<field name=

"screen_name"

>@thelabdude</field>
<field name=

"type"

>post</field>
<field name=

"timestamp"

>2012-05-22T09:30:22Z</field>
<field name=

"lang"

>en</field>
<field name=

"user_id"

>99991234567890</field>
<field name=

"favorites_count"

>10</field>
<field name=

"text"

>

#Yummm :) Drinking Cappuccino

Grecco in SF?s historic North Beach... Learning text
analysis with

#SolrInAction by @lidihuo on my i-Phone</field>

</doc>
</add>

如您所见,每个字段以 XML 格式显示,语法简单明了;我们只为所有字段定义了字段名称和值。我们没有注意到有关文本或文件类型分析的任何内容。这是因为我们在上图所示的 schema.xml 文档中定义了如何分析字段。众所周知,Solr 为其所有核心服务提供了一个基于 HTTP 的基本接口,包括文档更新服务用于添加和更新文档。在图的左上角,我们描述了使用 HTTP POST 将推文示例的 XML 发送到文档中的更新服务索尔。此外,我们将在本教程后面看到如何添加特定的文档类型,例如 JSON、CSV 和 XML。我们现在将了解可用于验证文档中所有字段内容的文档更新服务,然后调用文本分析过程。分析完所有字段后,生成的文本将添加到索引中,使文档可用于搜索。

schema.xml 文件定义任何文档的字段和字段类型。对于任何简单的应用程序,可能需要搜索字段及其类型。不过,它可用于对您的架构进行一些预先规划。

 

设计您的架构

在我们的示例中,搜索的微博应用程序将直接潜入并定义我们想要索引的文档。实际上,对于实际应用程序而言,此过程并不总是显而易见的,因此它有助于进行一些预先设计和规划工作。现在,我们将了解搜索应用程序的基本设计注意事项。具体来说,我们将学习回答关于我们的搜索软件的给定关键问题:

我们索引中的文档是什么?

如何唯一标识所有文档。

用户通常搜索我们文档中的哪些字段?

应该在搜索结果中向用户显示哪些字段?

让我们确定搜索应用程序中文档的适当粒度,这会影响您回答其他问题的方式。

 

使用 Post 命令添加文档

Solr 的 bin 目录里面,有一个 post 命令。我们可以在 Solr 中索引各种格式的文件,例如 CSV、JSON 和 XML。

我们可以浏览 Solr 的 bin 目录并运行 post 命令的-h 选项,如下所示代码块。

$ cd $SOLR_HOME 
$ ./post-h

当我们执行上面的命令时,我们会得到一个post命令的选项列表,如下图。

Usage: post-c <collection> [OPTIONS] <files

|directories|

urls

|-d ["

.."]> 
or post ?help  
   collection name defaults to DEFAULT_SOLR_COLLECTION

if

not specified  
OPTIONS 
======= 
Solr options: 
  -url <base Solr update URL> (overrides collection, host, and port) 
  -host <host> (default: localhost) 
  -p or-port <port> (default: 8983) 
  -commit yes|no (default: yes)  
Web crawl options:  
  -recursive <depth> (default: 1) 
  -delay <seconds> (default: 10)  
Directory crawl options: 
  -delay <seconds> (default: 0)  
stdin/args options: 
  -type <content/type> (default: application/xml)  
Other options: 
  -filetypes <type>[,<type>,.

..]

(default:   
   xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,
   rtf,htm,html,txt,log) 
  -params

"<key> = <value>[&<key> = <value>.

..]"

 

(values must be 
   URL-encoded; these pass through to Solr update request) 
  -out yes|no (default: no; yes outputs Solr response to console) 
  -format Solr (sends application/json content as Solr commands 
   to /update instead of /update/json/docs)  

示例

让我们以一个名为 sample.csv 的文件为例,其中包含给定的内容(在 bin 目录中)。

学生证 名字 电话 城市
001 Olivia +148022337 California
002 Emma +148022338 Hawaii
003 Sophia +148022339 Florida
004 Emily +148022330 Texas
005 Harper +148022336 Kansas
006 Scarlett +148022335 Kentucky

上面的数据表包含个人详细信息,如学生 ID、名字、电话和城市名称。下面给出了数据文件的 CSV 文件。在这里,我们必须注意,您需要提及架构,记录其第一行。

id 名字 电话号码 位置
001 Olivia +848022337 Michigan
002 Emma +848022338 Minnesota
003 Sophia +848022339 North Carolina
004 Emily +848022330 Ohio
005 Harper +848022336 Oregon
006 Scarlett +848022335 Pennsylvania

您可以使用下面给出的 post 命令在名为"sample_Solr"的核心中索引这些数据:

[Hadoop@localhost bin]$ ./post-c Solr_sample sample.csv 

当我们执行上述命令时,给定的文档将在指定的核心下建立索引并生成给定的输出。

/home/Hadoop/java/bin/java-classpath /home/Hadoop/Solr/dist/Solr-core
6.2.0.jar-Dauto = yes-Dc = Solr_sample-Ddata = files 
org.apache.Solr.util.SimplePostTool sample.csv 
SimplePostTool version 5.0.0 
Posting files to [base] url http://localhost:8983/Solr/Solr_sample/update... 
Entering auto mode. File endings considered are 
xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,
htm,html,txt,log 
POSTing file sample.

csv

(text/csv) to [base] 
1 files indexed. 
COMMITting Solr index changes to 
http://localhost:8983/Solr/Solr_sample/update... 
Time spent: 0:00:00.228

使用给定的 URL 转到 Solr Web 用户界面的主页:

http://localhost:8983/

选择核心主页上的 Solr_sample。不做任何修改,点击页面底部的 ExecuteQuery 按钮。

Indexing in Apache Solr

当我们执行查询时,我们可以观察到默认格式(JSON) 索引的 CSV 文档的数据,如下面的屏幕截图所示。

Apache Solr 中的索引

注意:

注意-同样,我们可以索引不同的文件格式,如 XML、CSV、JSON 等。

 

使用 Solr Web 界面添加文档

您还可以使用 Solr 提供的 Web 界面索引文档。让我们看看如何索引以下 JSON 文档。

[ 
   {

"id"

 :

"001"

,

"name"

 :

"Emma"

,

"age"

 : 25,

"Designation"

 :

"Executive"

,

"Location"

 :

"Texas"

, 
   }, 
   { 
      "id" :

"002"

, 
      "name" :

"Robert"

, 
      "age" : 43, 
      "Designation" :

"SR.Programmer"

, 
      "Location" :

"New York"

, 
   }, 
   { 
      "id" :

"003"

, 
      "name" :

"John"

, 
      "age" : 25, 
      "Designation" :

"JR.Programmer"

, 
      "Location" :

"California"

, 
   } 
] 

第 1 步: 使用给定的 URL 转到 Solr Web 界面-http://localhost:8983/

Indexing in Apache Solr

第 2 步: 选择核心"Solr_sample"。如下图所示,Request Handler、Common Within、Overwrite 和Boost 字段的值分别为/update、1000、true 和1.0。

步骤3: 最后,从 CSV、XML、JSON 等中选择您想要的文档格式。在文本区域下输入您想要索引的文档,然后单击"提交文档"按钮,如下面的屏幕截图所示。

Indexing in Apache Solr

 

使用 Java 客户端 API 添加文档

如您所见,以下是将文档添加到 Solr 索引的 Java 源代码。使用名称 AddDocument.java 保存此程序。

import java.io.IOException;  
import org.apache.Solr.client.Solrj.SolrClient; 
import org.apache.Solr.client.Solrj.SolrServerException; 
import org.apache.Solr.client.Solrj.impl.HttpSolrClient; 
import org.apache.Solr.common.SolrInputDocument;

public

class

AddingDocument {

public

static

void

main(String args[])

throws

Exception { 
      //Prepare the Solr client 
      String urlString =

"http://localhost:8983/Solr/my_core"

; 
      SolrClient Solr =

new

HttpSolrClient.

Builder

(urlString).

build

();   
      
      //Prepare the Solr doc. 
      SolrInputDocument doc =

new

SolrInputDocument(); 
   
      //Add fields to the doc.
      doc.

addField

(

"id"

,

"003"

); 
      doc.

addField

(

"name"

,

"Rajaman"

); 
      doc.

addField

(

"age"

,

"34"

); 
      doc.

addField

(

"addr"

,

"vishakapatnam"

); 
         
      //Add the doc. to Solr 
      Solr.

add

(doc);         
         
      //Save the changes 
      Solr.

commit

(); 
      System.

out.println

(

"Documents added"

); 
   } 
}

以上代码在终端执行以下命令即可编译-

$ javac AddingDocument 
$ java AddingDocument 

当我们运行上述命令时,我们将在显示器上收到以下输出。

输出:

已添加文档。

 Apache Solr 文本分析可用于消除术语之间的表面差异以解决更复杂的问题,从而提供良好的用户体验,例如特定语言的解析、词形还原, 和词性标记。我们将在前面更详细地讨论所有这些术语。 Apache Sol ...