集群 solr 搜索 怎么收集结果

作者&投稿:撒许 (若有异议请与网页底部的电邮联系)
solr集群创建索引时可以指定索引在哪台机器上吗~

  以下资料整理自网络,以及查看solr帮助文档。主要分为两部分,第一部分是对《db-data-config.xml》的配置内容的讲解(属于高级内容),第二部分是DataImportHandler(属于基础),第三部分是对db-data-config.xml的进阶   第一部分是对《db-data-config.xml》   query是获取全部数据的SQL deltaImportQuery是获取增量数据时使用的SQL deltaQuery是获取pk的SQL parentDeltaQuery是获取父Entity的pk的SQL      Full Import工作原理: 执行本Entity的Query,获取所有数据; 针对每个行数据Row,获取pk,组装子Entity的Query; 执行子Entity的Query,获取子Entity的数据。  

0×00 开头照例扯淡


自从各种脱裤门事件开始层出不穷,在下就学乖了,各个地方的密码全都改成不一样的,重要帐号的密码定期更换,生怕被人社出祖宗十八代的我,甚至开始用起了假名字,我给自己起一新网名”兴才”,这个看起来还不错的名字,其实是我们家乡骂人土话,意思是脑残人士…. -_-|||额好吧,反正是假的,不要在意这些细节。

这只是名,至于姓氏么,每个帐号的注册资料那里,照着百家姓上赵钱孙李周吴郑王的依次往下排,什么张兴才、李兴才、王兴才……于是也不知道我这样”兴才”了多久,终于有一天,我接到一个陌生电话:您好,请问是马兴才先生吗?

好么,该来的终于还是来了,于是按名索骥,得知某某网站我用了这个名字,然后通过各种途径找,果然,那破站被脱裤子了。
果断Down了那个裤子,然后就一发不可收拾,走上了收藏裤子的不归路,直到有一天,我发现收藏已经非常丰富了,粗略估计得好几十亿条数据,拍脑袋一想,这不能光收藏啊,我也搭个社工库用吧……

0×01 介绍


社工库怎么搭呢,这种海量数据的东西,并不是简单的用mysql建个库,然后做个php查询select * from sgk where username like ‘%xxxxx%’这样就能完事的,也不是某些幼稚骚年想的随便找个4g内存,amd双核的破电脑就可以带起来的,上面这样的语句和系统配置,真要用于社工库查询,查一条记录恐怕得半小时。好在这个问题早就被一种叫做全文搜索引擎的东西解决了,更好的消息是,全文搜索引擎大部分都是开源的,不需要花钱。

目前网上已经搭建好的社工库,大部分是mysql+coreseek+php架构,coreseek基于sphinx,是一款优秀的全文搜索引擎,但缺点是比较轻量级,一旦数据量过数亿,就会有些力不从心,并且搭建集群做分布式性能并不理想,如果要考虑以后数据量越来越大的情况,还是得用其他方案,为此我使用了solr。

Solr的基础是著名的Lucene框架,基于java,通过jdbc接口可以导入各种数据库和各种格式的数据,非常适合开发企业级的海量数据搜索平台,并且提供完善的solr cloud集群功能,更重要的是,solr的数据查询完全基于http,可以通过简单的post参数,返回json,xml,php,python,ruby,csv等多种格式。

以前的solr,本质上是一组servlet,必须放进Tomcat才能运行,从solr5开始,它已经自带了jetty,配置的好,完全可以独立使用,并且应付大量并发请求,具体的架构我们后面会讲到,现在先来进行solr的安装配置。

0×02 安装和配置


以下是我整个搭建和测试过程所用的硬件和软件平台,本文所有内容均在此平台上完成:


软件配置: solr5.5,mysql5.7,jdk8,Tomcat8 Windows10/Ubuntu14.04 LTS

硬件配置: i7 4770k,16G DDR3,2T西数黑盘

2.1 mysql数据库


Mysql数据库的安装和配置我这里不再赘述,只提一点,对于社工库这种查询任务远远多于插入和更新的应用来说,最好还是使用MyISAM引擎。
搭建好数据库后,新建一个库,名为newsgk,然后创建一个表命名为b41sgk,结构如下:

id bigint 主键 自动增长


username varchar 用户名


email varchar 邮箱


password varchar 密码


salt varchar 密码中的盐或者第二密码


ip varchar ip、住址、电话等其他资料


site varchar 数据库的来源站点

接下来就是把收集的各种裤子全部导入这个表了,这里推荐使用navicat,它可以支持各种格式的导入,具体过程相当的枯燥乏味,需要很多的耐心,这里就不再废话了,列位看官自己去搞就是了,目前我初步导入的数据量大约是10亿条。

2.2 Solr的搭建和配置


首先下载solr:
$ wget http://mirrors.hust.edu.cn/apache/lucene/solr/5.5.0/solr-5.5.0.tgz

解压缩:
$ tar zxvf solr-5.5.0.tgz

安装jdk8:
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
$ sudo apt-get install oracle-java8-set-default

因为是java跨平台的,Windows下和linux下solr是同一个压缩包,windows下jdk的安装这里不再说明。

进入解压缩后的solr文件夹的bin目录,solr.cmd和solr分别是windows和linux下的启动脚本:



因为社工库是海量大数据,而jvm默认只使用512m的内存,这远远不够,所以我们需要修改,打开solr.in.sh文件,找到这一行:

SOLR_HEAP=”512m”

依据你的数据量,把它修改成更高,我这里改成4G,改完保存. 在windows下略有不同,需要修改solr.in.cmd文件中的这一行:

set SOLR_JAVA_MEM=-Xms512m -Xmx512m

同样把两个512m都修改成4G。

Solr的启动,重启和停止命令分别是:
$ ./solr start
$ ./solr restart –p 8983
$ ./solr stop –all



在linux下还可以通过install_solr_service.sh脚本把solr安装为服务,开机后台自动运行。

Solr安装完成,现在我们需要从mysql导入数据,导入前,我们需要先创建一个core,core是solr的特有概念,每个core是一个查询、数据,、索引等的集合体,你可以把它想象成一个独立数据库,我们创建一个新core:

在solr-5.5.0/server/solr子目录下面建立一个新文件夹,命名为solr_mysql,这个是core的名称,在下面创建两个子目录conf和data,把solr-5.5.0/solr-5.5.0/example/example-DIH/solr/db/conf下面的所有文件全部拷贝到我们创建的conf目录中.接下来的配置主要涉及到三个文件, solrconfig.xml, schema.xml和db-data-config.xml。

首先打开db-data-config.xml,修改为以下内容:















这个文件是负责配置导入数据源的,请按照mysql实际的设置修改datasource的内容,下面entity的内容必须严格按照mysql中社工库表的结构填写,列名要和数据库中的完全一样。

然后打开solrconfig.xml,先找到这一段:

true
managed-schema


把它全部注释掉,加上一行,改成这样:

true
managed-schema
-->


这是因为solr5 以上默认使用managed-schema管理schema,需要更改为可以手动修改。

然后我们还需要关闭suggest,它提供搜索智能提示,在社工库中我们用不到这样的功能,重要的是,suggest会严重的拖慢solr的启动速度,在十几亿数据的情况下,开启suggest可能会导致solr启动加载core长达几个小时!

同样在solrconfig.xml中,找到这一段:



mySuggester
FuzzyLookupFactory
DocumentDictionaryFactory
cat
price
string




true
10


suggest




把这些全部删除,然后保存solrconfig.xml文件。

接下来把managed-schema拷贝一份,重命名为schema.xml (原文件不要删除),打开并找到以下位置:



只保留_version_和_root_节点,然后把所有的field,dynamicField和copyField全部删除,添加以下的部分:











id

这里的uniqueKey是配置文件中原有的,用来指定索引字段,必须保留。新建了一个字段名为keyword,它的用途是联合查询,即当需要同时以多个字段做关键字查询时,可以用这一个字段名代替,增加查询效率,下面的copyField即用来指定复制哪些字段到keyword。注意keyword这样的字段,后面的multiValued属性必须为true。

username和email以及keyword这三个字段,用来检索查询关键字,它们的类型我们指定为text_ik,这是一个我们创造的类型,因为solr虽然内置中文分词,但效果并不好,我们需要添加IKAnalyzer中文分词引擎来查询中文。在https://github.com/EugenePig/ik-analyzer-solr5下载IKAnalyzer for solr5的源码包,然后使用Maven编译,得到一个文件IKAnalyzer-5.0.jar,把它放入solr-5.5.0/server/solr-webapp/webapp/WEB-INF/lib目录中,然后在solrconfig.xml的fieldType部分加入以下内容:





保存后,core的配置就算完成了,不过要导入mysql数据,我们还需要在mysql网站上下载mysql-connector-java-bin.jar库文件,连同solr-5.5.0/dist目录下面的solr-dataimporthandler-5.5.0.jar,solr-dataimporthandler-extras-5.5.0.jar两个文件,全部拷贝到solr-5.5.0/server/solr-webapp/webapp/WEB-INF/lib目录中,然后重启solr,就可以开始数据导入工作了。

Facet 是 solr 的高级搜索功能之一 , 可以给用户提供更友好的搜索体验 . 在搜索关键字的同时 ,能够按照 Facet 的字段进行分组并统计 .

二. Facet 字段
1. 适宜被Facet 的字段
一般代表了实体的某种公共属性 , 如商品的分类 , 商品的制造厂家 , 书籍的出版商等等 .
2. Facet 字段的要求
Facet 的字段必须被索引 . 一般来说该字段无需分词 , 无需存储 .
无需分词是因为该字段的值代表了一个整体概念 , 如电脑的品牌 ” 联想 ” 代表了一个整体概念 , 如果拆成 ” 联 ”,” 想 ” 两个字都不具有实际意义 . 另外该字段的值无需进行大小写转换等处理 , 保持其原貌即可 .
无需存储是因为一般而言用户所关心的并不是该字段的具体值 , 而是作为对查询结果进行分组的一种手段 , 用户一般会沿着这个分组进一步深入搜索 .
3. 特殊情况
对于一般查询而言 , 分词和存储都是必要的 . 比如 CPU 类型 ”Intel 酷睿 2 双核 P7570”,拆分成 ”Intel”,” 酷睿 ”,”P7570” 这样一些关键字并分别索引 , 可能提供更好的搜索体验 . 但是如果将 CPU 作为 Facet 字段 , 最好不进行分词 . 这样就造成了矛盾 , 解决方法为 ,将 CPU 字段设置为不分词不存储 , 然后建立另外一个字段为它的 COPY, 对这个 COPY 的字段进行分词和存储 .
schema.xml

<types>
<fieldType name="string" class="solr.StrField" omitNorms="true"/>
<fieldType name="tokened" class="solr.TextField" >
<analyzer>
……
</analyzer>
</fieldType>
……
</types>
<fields>
<field name=”cpu” type=”string” indexed=”true” stored=”false”/>
<field name=”cpuCopy” type=” tokened” indexed=”true” stored=”true”/>
……
</fields>
<copyField source="cpu" dest="cpuCopy"/>

三. Facet 组件
Solr 的默认 requestHandler(org.apache.solr.handler.component.SearchHandler) 已经包含了 Facet 组件 (org.apache.solr.handler.component.FacetComponent). 如果自定义 requestHandler 或者对默认的 requestHandler 自定义组件列表 , 那么需要将 Facet 加入到组件列表中去 .
solrconfig.xml

<requestHandler name="standard" class="solr.SearchHandler" default="true">
……
<arr name="components">
<str>自定义组件名</str>
<str>facet</str>
……
</arr>
</requestHandler>

四. Facet 查询
进行 Facet 查询需要在请求参数中加入 ”facet=on” 或者 ”facet=true” 只有这样 Facet 组件才起作用 .
1. Field Facet
Facet 字段通过在请求中加入 ”facet.field” 参数加以声明 , 如果需要对多个字段进行 Facet查询 , 那么将该参数声明多次 . 比如

/select?q=联想
&facet=on
&facet.field=cpu
&facet.field=videoCard

返回结果 :

<lst name="facet_counts">
<lst name="facet_queries"/>
<lst name="facet_fields">
<lst name="cpu">
<int name="Intel 酷睿2双核 T6600">48</int>
<int name="Intel 奔腾双核 T4300">28</int>
<int name="Intel 酷睿2双核 P8700">18</int>
<int name="Intel 酷睿2双核 T6570">11</int>
<int name="Intel 酷睿2双核 T6670">11</int>
<int name="Intel 奔腾双核 T4400">9</int>
<int name="Intel 酷睿2双核 P7450">9</int>
<int name="Intel 酷睿2双核 T5870">8</int>
<int name="Intel 赛扬双核 T3000">7</int>
<int name="Intel 奔腾双核 SU4100">6</int>
<int name="Intel 酷睿2双核 P8400">6</int>
<int name="Intel 酷睿2双核 SU7300">5</int>
<int name="Intel 酷睿 i3 330M">4</int>
</lst>
<lst name="videoCard">
<int name="ATI Mobility Radeon HD 4">63</int>
<int name="NVIDIA GeForce G 105M">24</int>
<int name="NVIDIA GeForce GT 240M">21</int>
<int name="NVIDIA GeForce G 103M">8</int>
<int name="NVIDIA GeForce GT 220M">8</int>
<int name="NVIDIA GeForce 9400M G">7</int>
<int name="NVIDIA GeForce G 210M">6</int>
</lst>
</lst>
<lst name="facet_dates"/>
</lst>

各个 Facet 字段互不影响 , 且可以针对每个 Facet 字段设置查询参数 . 以下介绍的参数既可以应用于所有的 Facet 字段 , 也可以应用于每个单独的 Facet 字段 . 应用于单独的字段时通过

f.字段名.参数名=参数值

这种方式调用 . 比如 facet.prefix 参数应用于 cpu 字段 , 可以采用如下形式

f.cpu.facet.prefix=Intel

1.1 facet.prefix
表示 Facet 字段值的前缀 . 比如 ”facet.field=cpu&facet.prefix=Intel”, 那么对 cpu字段进行 Facet 查询 , 返回的 cpu 都是以 ”Intel” 开头的 ,”AMD” 开头的 cpu 型号将不会被统计在内 .
1.2 facet.sort
表示 Facet 字段值以哪种顺序返回 . 可接受的值为 true(count)|false(index,lex). true(count) 表示按照 count 值从大到小排列 . false(index,lex) 表示按照字段值的自然顺序( 字母 , 数字的顺序 ) 排列 . 默认情况下为 true(count). 当 facet.limit 值为负数时 ,默认 facet.sort= false(index,lex).
1.3 facet.limit
限制 Facet 字段返回的结果条数 . 默认值为 100. 如果此值为负数 , 表示不限制 .
1.4 facet.offset
返回结果集的偏移量 , 默认为 0. 它与 facet.limit 配合使用可以达到分页的效果 .
1.5 facet.mincount
限制了 Facet 字段值的最小 count, 默认为 0. 合理设置该参数可以将用户的关注点集中在少数比较热门的领域 .
1.6 facet.missing
默认为 ””, 如果设置为 true 或者 on, 那么将统计那些该 Facet 字段值为 null 的记录.
1.7 facet.method
取值为 enum 或 fc, 默认为 fc. 该字段表示了两种 Facet 的算法 , 与执行效率相关 .
enum 适用于字段值比较少的情况 , 比如字段类型为布尔型 , 或者字段表示中国的所有省份.Solr 会遍历该字段的所有取值 , 并从 filterCache 里为每个值分配一个 filter( 这里要求 solrconfig.xml 里对 filterCache 的设置足够大 ). 然后计算每个 filter 与主查询的交集 .
fc( 表示 Field Cache) 适用于字段取值比较多 , 但在每个文档里出现次数比较少的情况 .Solr 会遍历所有的文档 , 在每个文档内搜索 Cache 内的值 , 如果找到就将 Cache 内该值的count 加 1.
1.8 facet.enum.cache.minDf
当 facet.method=enum 时 , 此参数其作用 ,minDf 表示 minimum document frequency. 也就是文档内出现某个关键字的最少次数 . 该参数默认值为 0. 设置该参数可以减少 filterCache 的内存消耗 , 但会增加总的查询时间 ( 计算交集的时间增加了 ). 如果设置该值的话 ,官方文档建议优先尝试 25-50 内的值 .
2. Date Facet
日期类型的字段在文档中很常见 , 如商品上市时间 , 货物出仓时间 , 书籍上架时间等等 . 某些情况下需要针对这些字段进行 Facet. 不过时间字段的取值有无限性 , 用户往往关心的不是某个时间点而是某个时间段内的查询统计结果 . Solr 为日期字段提供了更为方便的查询统计方式 .当然 , 字段的类型必须是 DateField( 或其子类型 ).
需要注意的是 , 使用 Date Facet 时 , 字段名 , 起始时间 , 结束时间 , 时间间隔这 4 个参数都必须提供 .
与 Field Facet 类似 ,Date Facet 也可以对多个字段进行 Facet. 并且针对每个字段都可以单独设置参数 .
2.1 facet.date
该参数表示需要进行 Date Facet 的字段名 , 与 facet.field 一样 , 该参数可以被设置多次 , 表示对多个字段进行 Date Facet.
2.2 facet.date.start
起始时间 , 时间的一般格式为 ” 1995-12-31T23:59:59Z”, 另外可以使用 ”NOW”,”YEAR”,”MONTH” 等等 , 具体格式可以参考 org.apache.solr.schema. DateField 的 java doc.
2.3 facet.date.end
结束时间 .
2.4 facet.date.gap
时间间隔 . 如果 start 为 2009-1-1,end 为 2010-1-1.gap 设置为 ”+1MONTH” 表示间隔1 个月 , 那么将会把这段时间划分为 12 个间隔段 . 注意 ”+” 因为是特殊字符所以应该用 ”%2B” 代替 .
2.5 facet.date.hardend
取值可以为 true|false, 默认为 false. 它表示 gap 迭代到 end 处采用何种处理 . 举例说明 start 为 2009-1-1,end 为 2009-12-25,gap 为 ”+1MONTH”,hardend 为 false 的话最后一个时间段为 2009-12-1 至 2010-1-1;hardend 为 true 的话最后一个时间段为 2009-12-1 至 2009-12-25.
2.6 facet.date.other
取值范围为 before|after|between|none|all, 默认为 none.
before 会对 start 之前的值做统计 .
after 会对 end 之后的值做统计 .
between 会对 start 至 end 之间所有值做统计 . 如果 hardend 为 true 的话 , 那么该值就是各个时间段统计值的和 .
none 表示该项禁用 .
all 表示 before,after,all 都会统计 .
举例 :

&facet=on
&facet.date=date
&facet.date.start=2009-1-1T0:0:0Z
&facet.date.end=2010-1-1T0:0:0Z
&facet.date.gap=%2B1MONTH
&facet.date.other=all

返回结果 :

3. Facet Query
Facet Query 利用类似于 filter query 的语法提供了更为灵活的 Facet. 通过 facet.query 参数 , 可以对任意字段进行筛选 .
例 1:

&facet=on
&facet.query=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]
&facet.query=date:[2009-4-1T0:0:0Z TO 2009-5-1T0:0:0Z]

返回结果 :

<lst name="facet_counts">
<lst name="facet_queries">
<int name="date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]">5</int>
<int name="date:[2009-4-1T0:0:0Z TO 2009-5-1T0:0:0Z]">3</int>
</lst>
<lst name="facet_fields"/>
<lst name="facet_dates"/></lst>

例 2:返回结果 :

例 3:

&facet=on
&facet.query=cpu:[A TO G]

返回结果 :

<lst name="facet_counts">
<lst name="facet_queries">
<int name="cpu:[A TO G]">11</int>
</lst>
<lst name="facet_fields"/>
<lst name="facet_dates"/>
</lst>

4. key 操作符
可以用 key 操作符为 Facet 字段取一个别名 .
例 :

&facet=on
&facet.field={!key=中央处理器}cpu
&facet.field={!key=显卡}videoCard

返回结果 :

<lst name="facet_counts">
<lst name="facet_queries"/>
<lst name="facet_fields">
<lst name="中央处理器">
<int name="Intel 酷睿2双核 T6600">48</int>
<int name="Intel 奔腾双核 T4300">28</int>
<int name="Intel 酷睿2双核 P8700">18</int>
<int name="Intel 酷睿2双核 T6570">11</int>
<int name="Intel 酷睿2双核 T6670">11</int>
<int name="Intel 奔腾双核 T4400">9</int>
<int name="Intel 酷睿2双核 P7450">9</int>
<int name="Intel 酷睿2双核 T5870">8</int>
<int name="Intel 赛扬双核 T3000">7</int>
<int name="Intel 奔腾双核 SU4100">6</int>
<int name="Intel 酷睿2双核 P8400">6</int>
<int name="Intel 酷睿2双核 SU7300">5</int>
<int name="Intel 酷睿 i3 330M">4</int>
</lst>
<lst name="显卡">
<int name="ATI Mobility Radeon HD 4">63</int>
<int name="NVIDIA GeForce G 105M">24</int>
<int name="NVIDIA GeForce GT 240M">21</int>
<int name="NVIDIA GeForce G 103M">8</int>
<int name="NVIDIA GeForce GT 220M">8</int>
<int name="NVIDIA GeForce 9400M G">7</int>
<int name="NVIDIA GeForce G 210M">6</int>
</lst>
</lst>
<lst name="facet_dates"/>
</lst>

5. tag 操作符和 ex 操作符
当查询使用 filter query 的时候 , 如果 filter query 的字段正好是 Facet 字段 , 那么查询结果往往被限制在某一个值内 .
例 :

&fq=screenSize:14
&facet=on
&facet.field=screenSize

返回结果 :

<lst name="facet_counts">
<lst name="facet_queries"/>
<lst name="facet_fields">
<lst name=" screenSize">
<int name="14.0">107</int>
<int name="10.2">0</int>
<int name="11.1">0</int>
<int name="11.6">0</int>
<int name="12.1">0</int>
<int name="13.1">0</int>
<int name="13.3">0</int>
<int name="14.1">0</int>
<int name="15.4">0</int>
<int name="15.5">0</int>
<int name="15.6">0</int>
<int name="16.0">0</int>
<int name="17.0">0</int>
<int name="17.3">0</int>
</lst>
</lst>
<lst name="facet_dates"/>
</lst>

可以看到 , 屏幕尺寸 (screenSize) 为 14 寸的产品共有 107 件 , 其它尺寸的产品的数目都是0, 这是因为在 filter 里已经限制了 screenSize:14. 这样 , 查询结果中 , 除了 screenSize=14 的这一项之外 , 其它项目没有实际的意义 .
有些时候 , 用户希望把结果限制在某一范围内 , 又希望查看该范围外的概况 . 比如上述情况 ,既要把查询结果限制在 14 寸屏的笔记本 , 又想查看一下其它屏幕尺寸的笔记本有多少产品 . 这个时候需要用到 tag 和 ex 操作符 .
tag 就是把一个 filter 标记起来 ,ex(exclude) 是在 Facet 的时候把标记过的 filter 排除在外 .
例 :

&fq={!tag=aa}screenSize:14
&facet=on
&facet.field={!ex=aa}screenSize

返回结果 :

<lst name="facet_counts">
<lst name="facet_queries"/>
<lst name="facet_fields">
<lst name=" screenSize">
<int name="14.0">107</int>
<int name="14.1">40</int>
<int name="13.3">34</int>
<int name="15.6">22</int>
<int name="15.4">8</int>
<int name="11.6">6</int>
<int name="12.1">5</int>
<int name="16.0">5</int>
<int name="15.5">3</int>
<int name="17.0">3</int>
<int name="17.3">3</int>
<int name="10.2">1</int>
<int name="11.1">1</int>
<int name="13.1">1</int>
</lst>
</lst>
<lst name="facet_dates"/>
</lst>

这样其它屏幕尺寸的统计信息就有意义了 .
五. SolrJ 对 Facet 的支持

SolrServer server = getSolrServer();//获取SolrServer
SolrQuery query = new SolrQuery();//建立一个新的查询
query.setQuery("*:*");
query.setFacet(true);//设置facet=on
query.addFacetField(new String[] { "cpu", "videoCard" });//设置需要facet的字段
query.setFacetLimit(10);//限制facet返回的数量
QueryResponse response = server.query(query);
List<FacetField> facets = response.getFacetFields();//返回的facet列表
for (FacetField facet : facets) {
System.out.println(facet.getName());
System.out.println("----------------");
List<Count> counts = facet.getValues();
for (Count count : counts) {
System.out.println(count.getName() + ":" + count.getCount());
}
System.out.println();
}


特克斯县17153461962: 集群 solr 搜索 怎么收集结果 -
熊志博尔: Facet 是 solr 的高级搜索功能之一 , 可以给用户提供更友好的搜索体验 . 在搜索关键字的同时 ,能够按照 Facet 的字段进行分组并统计 .二. Facet 字段 1. 适宜被Facet 的字段 一般代表了实体的某种公共属性 , 如商品的分类 , 商品的制造厂家 ...

特克斯县17153461962: solr是怎么从数据库检索数据的 -
熊志博尔: solr检索肯定是检索索引,但每一个doc的field都可以配置(schema.xml)是否存储,如果存储了,那么检索出来的doc也可以返回这个field的数据. 至于添加索引数据,好像只能用curl或者solrj的方式吧.

特克斯县17153461962: 如何对solr中数据进行查询统计并得到全部查询统计结果 -
熊志博尔: 条件组合查询 SQL查询语句: SELECT log_id,start_time,end_time,prov_id,city_id,area_id,idt_id,cnt,net_type FROM v_i_event WHERE prov_id = 1 AND net_type = 1 AND area_id = 10304 AND time_type = 1 AND time_id >= 20130801 AND time_id <= 20130815 ORDER BY log_id LIMIT 10;

特克斯县17153461962: solr 如何搜索mysql表数据 -
熊志博尔: 建议去了解solr,你为什么要用solr,它们之间没有直接的联系,数据时相互独立的 你可以同solr的插件dataimport,把数据库某些想关表的数据索引到solr的文档去,这样就可以搜索了

特克斯县17153461962: 如何使用solrcloud的检索,存储功能 -
熊志博尔: 5亿数据量,得考虑用solrcould分片了.使用solrcolud对索引分片,减小单个搜索实例的索引量来提高响应时间,当然使用replica可以提高并发效率.

特克斯县17153461962: solr配置文件怎么配置按照条件查询 -
熊志博尔: solr的三个配置文件:1、solrconfig.xml 只配置一次就够了2、data-config.xml 配置数据库与solr搜索的映射关系,需要按实际情况处理3、schema.xml 配置solr搜索字段

特克斯县17153461962: 如何对solr建立的索引进行搜索 -
熊志博尔: 以下资料整理自网络,以及查看solr帮助文档.主要分为两部分,第一部分是对《db-data-config.xml》的配置内容的讲解(属于高级内容),第二部分是DataImportHandler(属于基础),第三部分是对db-data-config.xml的进阶第一部分是对《...

特克斯县17153461962: 如何通过solrj进行查询 -
熊志博尔: 一、获取server 使用前,先new一个server,... 主要的问题就在如何根据需求构造SolrParams来执行高效查询. 我们看下SolrParams: ...望采纳

特克斯县17153461962: solr做搜索的时候,用"我们"来搜有结果,用"我"搜就没有,请教大神什么原因,怎么改正 -
熊志博尔: 首先搜索引擎有两个阶段:创建索引,和搜索 举个例子:1.『我们搞基吧』被分词为『我们,搞基,吧』被存储到索引里 2.『我们搞基吧』被分词为『我,们,搞基,吧』被存储到索引里 那么在搜索的时候,你搜『我们』的时候,只有第一种分词的方式才会被搜到;如果你搜『我』的时候,只有第二种分词的方式才会被搜索到;如果你搜『搞基』的时候,两种分词方式的结果才都会被搜索到.所以你搜『我们』有结果,是因为你建索引的时候『我们』分词被分成了『我们』,而不是『我』『们』,你搜『我』肯定不会有结果啊,所以搜索和简历索引的时候要一致,或者存储索引的分词结果一定要包含搜索分词的结果,当然这是理想情况,总值,原因就是搜索和索引的分词的方式不一致导致的

特克斯县17153461962: solr 的 stats 查出来的数据 java怎么取 -
熊志博尔: 1、将解压包中的solr-4.7.1/dist/solr-4.7.1.war复制到tomcat_dir/webapps/目录,并命名为solr.war. 2、将solr-4.7.1/example/lib/ext/目录下的jar文件复制到tomcat/lib目录下,将solr-4.7.1/example/resources/下的log4j.properties

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网