如何在Solr中实现多solr5.0 多个core查询询

原文:/mandela/archive//2041754.html&Search步骤a.SolrParams参数准备q & 查询语句sort & 排序字段&排序方式rows & 返回多少条 start & 起始点fl & 返回字段,需要返回scorer字段的话这个KEY对应的VALUE里包含&score&就可以了qt & 查询类型,根据这个字段找Handlerfq & FilterQueryb.根据coreName到coreContains拿到SolrCore,再到SolrParams里去qt的VALUE到SolrCore找对应的SolrRequestHandler如果没找到需要调用core.close表示归还,在从coreContains那里拿core时将它的被引用做了++操作了的c.根据SolrParams&SolrCore构造一个SolrQueryRequest,其包含如下属性SolrCore, SolrParams, Map&obj, obj& context实例化一个SolrQueryResponse,有了这两个对象后就可以调用solrcore.execute执行查询操作了d.solrcore.execute & 实际上执行的是handler.handleRequest(request, response)[1].SolrRequestHandler可以配置三个不同重要性的默认参数,defaults,appends,invariants上面提到过,handler在处理请求的第一步就是用这三个SolrParams包装用户提交的SolrParams。其包装逻辑是params为用户提交的SolrParamsdefaults作为params的默认取值SolrParams -& paramsappends作为params里getParams添加参数的SolrParams && paramsparams作为invariants的默认取值SolrParams && params[2].先前提到对于SearchHandler有SearchComponent,这里只需要注意下QueryComponent就可以了,添加其他的组件一 是可能没有用二是会带来内存开销,比如StatsComponent组件加入的话查询会返回符合结果的DocSet,其本身也没什么用在 SearchHandler处理查询请求逻辑里面其会先初始化一个ResponseBuilder,这个对象用来存放各个SearchComponent 处理的其他或者结构需要的数据,资源协调者;其再迭代SearchComponent调用prepare函数;其再迭代SearchComponent调 用process函数整个core里SearchComponent只有一个实例,处理查询请求的数据当然不能放在这些SearchComponent里,只能放在资源协调者ResponseBuilder上&[3].组件QueryComponent的prepare(ResponseBuilder)逻辑---------request.params.get[fl]拿到希望返回的域,判断里面是否包含scorer && 设置到ResponseBuilder上request.params.get[defType]拿到QueryParserPlugin名字,如果为null则使用LuceneQParserPlugin.NAMErequest.params.get[q]拿到查询字符串 &&设置到ResponseBuilder上QParser.getParser(queryStr, queryParserType, request)解析得到Qparser,其解析过程大致是---------a.实例化一个Map&String, String&用来存放从queryStr以正则表达式{!(.*)}抽取的group(1)里符合正则x|x=&(.*)&|x=&(.*)&|x=/$(.*)/$|x=(.*) |x=(.*)$ - x表示符合JAVA变量命名规则的字符串对于第一种往MAP里PUT(&type&, x),对于第四种则PUT(x, request.params.get(group(1)));其他的put(x, group(1))queryStr里正则{!(.*)}剩下的PUT(&v&, 剩下的str),MAP && MapSolrParams作为localParamsb.从localParams找&typd&.value作为指定QueryParserPlugin的值,如果没有还是使用默认的LuceneQParserPlugin.NAME如果queryStr里包含正则{!(.*)}则queryStr=localParams.get(&v&)c.根据指定的QueryParserPlugin的名称到core里获取QueryParserPlugin,调用其createParser函数构造Qparser其传入的参数有{queryStr, localParams, requst.params, request}d.以LuceneQParserPlugin为例子查看其构造Qparser - LuceneQParser的过程,Qparser的作用主要是构造一个Query在实例化时如果localParams.get(&tags&)不为null则会取request.context.get(&tags&)其值是一个Map&str, collection&,如果取的值是null则new以个PUT到request.context里,再来解析localParams.get(&tags&)得到的字符串,有&,&切割得到的子字符串PUT到request.context.get(&tags&)得到的Map中,VALUE=List.add(LuceneQParserPlugin),以解析{!tag=&wdx,monkey&}为例子,context.get(&tags&)里有两个映射&wdx& -& List & {LuceneQParserPlugin} //LuceneQParserPlugin持有request, queryStr, params, localParams&monkey& -& List & {LuceneQParserPlugin}---------调用Qparser.parse获取Query的逻辑是a.到localParam&params里找&df& & 默认字段,找VALUE时localParam优先,找不到再到params里面,如果没找到则到core.indexSchema那里拿b.到localParam&params里找&q.op& & BooleanQuery默认关系,拿的逻辑同上c.实例化一个SolrQueryParser解析queryStr -& Query输出得到Query &&设置到ResponseBuilder上---------抽取localParam&params里的&sort&,&rows&,&start& && 设置到ResponseBuilder上,其中sort可以指定schema里指定的域名|score|docid同时把Qparser设置到ResponseBuilder上---------处理&fq& & FilterQueryrequest.params.get(&fq&)得到过滤查询String[],迭代这个数组调用QParser.getParser(str, null, request)获取Qparser解析str得到过滤查询Query,QParser.getParser的逻辑上面介绍过,这样得到一个过滤查询的链表,将这个链表设置到ResponseBuilder上[4].组件QueryComponent的process(ResponseBuilder)逻辑a.每个request都只持有一个IndexSearcher的引用,通过调用core.getSearcher获取,QueryComponent需要先获取IndexSearcher,core.getSearcher里的逻辑是----getSearcher的逻辑getSearcher & (forceNew, returnSearcher, waitSearcher-Futures)关注solr全局三个点调用getSearcher函数 : solrCore初始化时(false, false, null),QueryComponent处理查询请求时(false, true, null),UpdateHandler在处理commit请求时(true, false, new Future[1])---------1.solrCore初始化时根据solrconfig配置的IndexReaderFactory&DirectoryFactory获取索引的IndexReader,再使用这个reader封装一个SolrIndexReader,再使用这个SolrIndexReader封装一个RefCounted(searcher的引用计数器,当搜索组件获取一个组件后引用++,用完后调用close引用--,当引用数为0时将这个引用从core管理的一个当前被使用的searcher的链表移除,同时调用searcher.close回收资源),将这个引用添加到core管理的一个当前被使用的searcher的链表里如果firstSearcherListeners不为空则回调这些监听器,这个回调是交给core的一个newSingleThreadExecutor去做的,再往这个线程池里添加一个任务:将这个RefCounted设置为core当前最新的searcher的引用计数器最后返回null,因为returnSearcher=false在solrCore初始化时这样做的主要目的是在初始化时就加载好IndexSearcher,搜索请求来了之后能立即返回,而不必等待加载IndexSearcher---------2.QueryComponent处理查询请求时由于core当前最新的searcher的引用计数器不为null且这个获取IndexSearcher的请求不是强制要求获取最新的,且returnSearcher=true故直接返回core当前最新的searcher的引用计数器,且这个引用计数器做++这里面还有段当前searcher的引用计数器为null的逻辑,但是没有发现有什么情况会导致这种情况发生故不累述了---------3.UpdateHandler在处理commit请求时首先到core管理的一个当前被使用的searcher的链表里获取目前最新的searcher;同时会加载索引目录下的index.properties文件(如果存在的话),拿到KEY=&index&的值,其指明目前索引的存放地方;如果获取的目录和当前最新的searcher使用的目录一致且solrConfig.reopenReaders为true则获取通过searher.reader.reopen获取最新的reader -& 封装成searcher,否则直接IndexReader.open获取reader。获取到searcher后的一段逻辑[RefCount封装,添加到searchers链表]和core初始化时是一样的,接下来的逻辑是如果solrConfig.useColdSearcher为TRUE其当前searcher的引用为null-导致来自QueryComponent的请求阻塞[现在还没发现什么情况会导致searcher的引用为null]立即将这个新的searcher的引用设置为core当前最新的searcher的引用计数器,这样来自QueryComponent的请求拿到这个引用后返回,当时这时这个新建的searcher是没有经过其前一个searcher的cache热身的,同时这样会导致这个新建的searcher不会进行热身活动如果solrConfig.useColdSearcher为FALSE则会往线程池里添加一个热身的任务如果newSearcherListeners不为空则回调这些监听器,也是给线程池的任务最后如果先前没有做将新的searcher的引用设置为core当前最新的searcher的引用计数器的行为的话,则往线程池添加一个任务 & 将新的searcher的引用设置为core当前最新的searcher的引用计数器最后返回null,因为returnSearcher=false-------------solr的索引视图用IndexReader构建SolrIndexSearcher时会先用solr的视图包装这个IndexReader && SolrIndexReadersolr 的索引视图在lucene上添加了一层快速处理多个索引目录的视图,在用IndexReader构建SolrIndexReader时会获取这个 reader下的所有叶子Reader-SegmentReader,并建立索引,基于这样索引传入一个DOCID后能快速的定位 SegementReader,即其会持有其下的所有SegementReader&其start-offset,同时search时如果是 TermQuery则直接用叶子reader来做----SolrIndexSearcher.cachea.SolrIndexSearcher有四个缓存 & 对于cache来说有三个角色CacheConfig,SolrCache,CacheRegenerator其分工是CacheConfig来自于solrconfig文件配置,在一个searcher初始化时会迭代fieldValueCache,filterCache,queryResultCache,documentCache的配置,如果有配置则通过CacheConfig @class创建SolrCache实例CacheRegenerator是负责新searcher创建后用老的searcher热身行为的,会遍历老的searcher的各个cache的key-value具体做什么由各个CacheRegenerator说了算,因为这时候由于update的commit操作会有新的doc进入索引,所有老的value都不能用了,唯一能做的就是知道哪些key比较热门对于filterCache来说其会使用新的searcher去加载这些热门的key的值放到cache里对于queryResultCache来说其会使用新的searcher去加载这些热门query的值放到cache里,当时查询参数flag会加上NO_CHECK_QCACHE-------SolrCache : filterCache queryResultCache documentCachequeryResultCache & key=QueryResultKey value=DocList,主要是存放一个查询请求返回的DocList数据,QueryResultKey计算hash的影响因素有 : query filters sortdocumentCache & key=int value=Document,主要是存放docid-&document的映射,在加载document时都会走这个缓存,如果不存在则用reader去加载,然后PUT到cache里filterCache :key=Query value=DocSet,主要存放query-&docSet的映射,满足这个query的所有docid的映射,其作用和queryResultCache比区别在于其存放的可能只是中间结果,queryResultCache存放的是最终结果值得注意的是使用这些cache是很耗内存空间的,为了限制内存空间的使用,cache的实现也是使用LRU机制,通过实现LinkedHashMap的removeEldestEntry函数里判断目前的大小是否大于了限制来实现的-------b.对于纯粹的来自QueryComponent组件的查询请求是只需要返回DocList就可以了,可能还需要分数,这里分析为了简便只考虑需要DocList和分数的情况根据offset+len计算当期期望的最大的docId,再和maxDoc比较,不能比maxDoc大如果queryResultCache存在且这个查询没有过滤查询则到用这个查询封装一个QueryResultKey到queryResultCache取值如果存在且[查询不需要分数或者cache里有分数]这样就立即拿到了docList返回,查询结束如果cache里没有找到或者需要分数而cache里没分数则需要走查询了,对于查询的结果如果可以cache则put到queryResultCache---------------拿到DocList了后就可以给SolrQueryResponse返回了...本文出自 “记录我的点点滴滴” 博客,请务必保留此出处http://yinyayun./026那么创建的core都会用这份默认的配置_解决方案网当前位置:& &&&SolrCloud中的文件与Collection治理SolrCloud中的文件与Collection治理本文收集于网络,只用于方便查找方案,感谢源作者,如果侵权请联系删除SolrCloud中的文件与Collection管理
转载请出自出处:/blog/2124078
一.内嵌启动SolrCloud时端口默认分配
当 Solr 运行内嵌 zookeeper 服务时,默认使用 solr 端口+1000 作为客户端口,另外,solr 端口+1 作为 zookeeper 服务端口,solr 端口+2 作为主服务选举端口。所以第一个例子中,Solr 运行在 8983端口,内嵌 zookeeper 使用 9983 作为客户端端口,9984 和 9985 作为服务端口。
clientPort=9983
server.1=192.168.238.133:
这几个端口就是对应配置里面的这几个端口
内嵌启动的SolrCloud的例子点击:http://wiki.apache.org/solr/SolrCloud
二. 通过集群api 管理集群(Core Admin)
1).创建接口(第一种自动分配)
http://192.168.66.128:8081/solr/admin/collections?action=CREATE&name=collection1&numShards=3&replicationFactor=2&maxShardsPerNode=2&collection.configName=myconf
http://192.168.66.128:8081/solr/admin/collections?action=CREATE&name=collection1&numShards=3&replicationFactor=2&maxShardsPerNode=2&collection.configName=myconf&createNodeSet=192.168.66.128:8083_solr,192.168.66.128:8081_solr,192.168.66.128:8082_solr
这样会出来一个collection,它有3个shard,每个shard有1个数据节点,1个备份节点,即该collection共有6个core
name:将被创建的集合的名字numShards:集合创建时需要创建逻辑碎片的个数replicationFactor:分片的副本数。replicationFactor(复制因子)为 3 意思是每个逻辑碎片将有 3 份副本。
maxShardsPerNode:默认值为1,每个Solr服务器节点上最大分片数(4.2新增的)
注意三个数值:numShards、replicationFactor、liveSolrNode(当前存活的solr节点),一个正常的solrCloud集群不容许同一个liveSolrNode上部署同一个shard的多个replic,因此当maxShardsPerNode=1时,numShards*replicationFactor&liveSolrNode时,报错。因此正确时因满足以下条件:numShards*replicationFactor&liveSolrNode*maxShardsPerNode
createNodeSet:如果不提供该参数,那么会在所有活跃节点上面创建core,如果提供该参数就会在指定的solr节点上创建core
例如我现在在5台tomcat上面创建3个片,1个副本,不提供该参数结果是这样的
提供该参数例如:createNodeSet=192.168.66.128:8083_solr,192.168.66.128:8081_solr,192.168.66.128:8082_solr
结果是这样的
collection.configName:用于新集合的配置文件的名称。如果不提供该参数将使用集合名称作为配置文件的名称。
创建接口2(手动分配)实例:通过下面多个链接进行创建(3个分片,每个节点上面一个备份)推荐使用,因为这种方式你想创建多少次就多少次
http://192.168.66.128:8081/solr/admin/cores?action=CREATE&name=shard1_replica1&instanceDir=shard1_replica1&dataDir=data&collection=collection1&shard=shard1&collection.configName=myconf
http://192.168.66.128:8082/solr/admin/cores?action=CREATE&name=shard1_replica2&instanceDir=shard1_replica2&dataDir=data&collection=collection1&shard=shard1&collection.configName=myconf
http://192.168.66.128:8082/solr/admin/cores?action=CREATE&name=shard2_replica1&instanceDir=shard2_replica1&dataDir=data&collection=collection1&shard=shard2&collection.configName=myconf
http://192.168.66.128:8083/solr/admin/cores?action=CREATE&name=shard2_replica2&instanceDir=shard2_replica2&dataDir=data&collection=collection1&shard=shard2&collection.configName=myconf
http://192.168.66.128:8083/solr/admin/cores?action=CREATE&name=shard3_replica1&instanceDir=shard3_replica1&dataDir=data&collection=collection1&shard=shard3&collection.configName=myconf
http://192.168.66.128:8081/solr/admin/cores?action=CREATE&name=shard3_replica2&instanceDir=shard3_replica2&dataDir=data&collection=collection1&shard=shard3&collection.configName=myconf
参数含义:
name:新建core的名称
创建的core的命名规则:
coreName_shardName_replicaN
例如:创建pscp的集合,2个分片,每个分片上面有两个备份
则命名如下:
pscp_shard1_replica1
pscp_shard1_replica2
pscp_shard2_replica1
pscp_shard2_replica2
shard:指定一个分配id,这个core将挂在那个分片上(随便写,如果还没有这个id,第一次会帮你创建)collection.configName:从zookeeper中指定一份配置文件
instanceDir和dataDir:从下图看出他的含义
命名规则:instanceDir与name的名称相同,dataDir:统一建议命名为data
总结一:在一个集群中添加一个副本的两种方式
http://192.168.66.128:8081/solr/admin/collections?action=ADDREPLICA&collection=collection1&shard=shard2&node=192.168.66.128:8085_solr
上面这句话的意思就是在collection1这个集合的shard2分片上添加一个副本,副本的地址在192.168.66.128:8085_solr台机子上面
http://192.168.66.128:8083/solr/admin/cores?action=CREATE&name=shard3_replica1&instanceDir=shard3_replica1&dataDir=data&collection=collection1&shard=shard3&collection.configName=myconf
2).删除接口
http://localhost:8983/solr/admin/collections?action=DELETE&name=mycollection
name:将被创建的集合别名的名字collections:逗号分隔的一个或多个集合别名的列表
3).重新加载接口,这个时候,相应的core会重新加载配置文件
http://localhost:8983/solr/admin/collections?action=RELOAD&name=mycollection
name:将被重载的集合的名字
4).分割碎片接口
http://localhost:8983/solr/admin/collections?action=SPLITSHARD&collection=&collection_name&&shard=shardId
collection:集合的名字
shard:将被分割的碎片 ID
这个命令不能用于使用自定义哈希的集群,因为这样的集群没有一个明确的哈希范围。 它只用于具有plain 或 compositeid 路由的集群。该命令将分割给定的碎片索引对应的那个碎片成两个新碎片。通过将碎片范围划分成两个相等的分区和根据新碎片范围分割出它在父碎片(被分的碎片)中的文档。新碎片将被命名为 appending_0 和_1。例如:shard=shard1 被分割,新的碎片将被命名为 shard1_0 和 shard1_1。一旦新碎片被创建,它们就被激活同时父碎片(被分的碎片)被暂停因此将没有新的请求到父碎片(被分的碎片)。该特征达到了无缝分割和无故障时间的要求。原来的碎片数据不会被删除。使用新 API 命令重载碎片用户自己决定。该特性发布始于 Solr4.3,由于 4.3 发布版本发现了一些 bugs,所以要使用该特性推荐等待 4.3.1
三.通过命令行工具将文件上传到Zookeeper进行管理
之所以能分布式是因为引入ZooKeeper来统一保存配置文件,故而需要将SolrCloud的配置文件上传到ZooKeeper中,这里演示命令行进行上传
要使用命令行管理管理工具,必须要先有包,这些包就是solr.war里面/WEB-INF/lib下面的所有jar包
第一步:新建文件夹
在可以和Zookeeper集群通讯的任意一台机子上面,新建两个文件夹,例如如下是我的目录
/usr/solrCloud/conf/files
/usr/solrCloud/conf/lib
files:用来保存配置文件
lib:用来存放jar包
第二步:上传需要使用的jar和配置文件
上传jar到lib目录,将solr发布包下面的jar(solr-4.8.0\example\solr-webapp\webapp\WEB-INF\lib\ 和 solr-4.8.0\example\lib\ext\ 下面包都要)全部上传到上面的lib目录
将solr的配置文件上传到上面的files目录下面
第三步:将文件上传Zookeeper进行统一管理
java -classpath .:/usr/solrCloud/conf/lib/* org.apache.solr.cloud.ZkCLI -cmd upconfig -zkhost 192.168.27.18:.27.18:.27.18:2183 -confdir /usr/solrCloud/conf/files
-confname myconf
-cmd upconfig:上传配置文件
-confdir:配置文件的目录
-confname:指定对应的名称
查看文件是否已经上传到Zookeeper服务器:
sh zkCli.sh -server localhost:2181
ls /configs/myconf
第四步:将上传到ZooKeeper中配置文件与collection相关联
java -classpath .:/usr/solrCloud/conf/lib/* org.apache.solr.cloud.ZkCLI -cmd linkconfig -collection collection1 -confname myconf -zkhost 192.168.27.18:.27.18:.27.18:2183
-cmd linkconfig:为指定collection"绑定"配置文件
-collection:上面指定的collection的名称
-confname:zookeeper上面的配置文件名称
上面这句代码的意思就是:创建的core(collection1)将使用myconf这个配置文件
例如:执行下面这个请求将创建一个core为collection1,那么他使用的配置文件为zookeeper中的myconf这个配置
http://localhost:8983/solr/admin/collections?action=CREATE&name=collection1&numShards=3&replicationFactor=1
话又说回来,如果zookeeper管理的集群上面仅有一份配置,那么创建的core都会用这份默认的配置。如果有多份,如果没有执行第四步,随便创建一个core将抛出异常,构建失败!
例如执行:
http://192.168.66.128:8081/solr/admin/collections?action=CREATE&name=sdf&numShards=3&replicationFactor=1
将抛出:因为上面有两份配置,但是并没有执行第四步,将配置与即将创建core(name=sdf)关联起来
&response&
&lst name="responseHeader"&
&int name="status"&0&/int&
&int name="QTime"&16563&/int&
&lst name="failure"&
org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException:Error CREATEing SolrCore 'sdf_shard2_replica1': Unable to create core: sdf_shard2_replica1 Caused by: Could not find configName for collection sdf found:[conf1, myconf]
org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException:Error CREATEing SolrCore 'sdf_shard1_replica1': Unable to create core: sdf_shard1_replica1 Caused by: Could not find configName for collection sdf found:[conf1, myconf]
org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException:Error CREATEing SolrCore 'sdf_shard3_replica1': Unable to create core: sdf_shard3_replica1 Caused by: Could not find configName for collection sdf found:[conf1, myconf]
&/response&
当然了第四步也可以用下面替换,而且下面这个更灵活,推荐使用(有了这步,第四步完全可以省略)
http://192.168.66.128:8081/solr/admin/collections?action=CREATE&name=conf2&numShards=3&replicationFactor=1&collection.configName=myconf
collection.configName=myconf:为创建的core指定一个在zookeeper中配置
文档写到这里,下面来看下怎么对上传到zookeeper中的文件进行修改和删除操作:
修改的常用做法就是:重新上传,重新上传会覆盖上面的文件,从而达到修改的目的
删除zookeeper中的文件或者目录的方式如下:
[zk: 192.168.66.128:2181(CONNECTED) 7] delete /configs/conf1/schema.xml
[zk: 192.168.66.128:2181(CONNECTED) 10] ls /configs/conf1
[solrconfig.xml]
[zk: 192.168.66.128:2181(CONNECTED) 11]
将配置上传到zookeeper,如果要让正在运行的solr同步加载这些文件,只需要需要让solr重新加载一下配置文件,在浏览器中输入
http://192.168.27.18:8081/solr/admin/collections?action=RELOAD&name=collection1
参考文献:
怎么通过api来管理整个集群的collection官网
https://cwiki.apache.org/confluence/display/solr/Collections+API
通过api来管理solr core 官网
http://wiki.apache.org/solr/CoreAdmin
SolrCloud在tomcat上面的部署 官网
http://wiki.apache.org/solr/SolrCloudTomcat
值得参考的博客:
http://blog.csdn.net/xyls12345/article/details/
/solrcloud-cluster-single-collection-deployment.html#deploying-solrcloud
http://blog.csdn.net/woshiwanxin102213/article/details/
http://blog.csdn.net/natureice/article/details/9109351
solrcloud名称解释
http://www.solr.cc/blog/?p=99
solr.xml解释
上一篇:下一篇:
File: 10:34:12| 时间排序
补充一点, Lucene 4.0 加入了 Doc Values 替换原本的Field cache. 可能开始的时候并没有原来的Field cache 快,但是是更加scalable 的办法。&br&&br&数据规模一大,关键问题是GC
补充一点, Lucene 4.0 加入了 Doc Values 替换原本的Field cache. 可能开始的时候并没有原来的Field cache 快,但是是更加scalable 的办法。数据规模一大,关键问题是GC
我在找hadoop、java大数据管理,开发人才,坐标:深圳罗湖国贸 ,邮箱
我在找hadoop、java大数据管理,开发人才,坐标:深圳罗湖国贸 ,邮箱
Netflex 去年的公开数据 说 已经超过一共 超过 2000 个 nodes,当然是多个集群。 我个人很少听说公司 in production 真的用了很多nodes&br&补充公开的use case :&br&&a href=&///?target=https%3A//www.elastic.co/use-cases& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&elastic.co/use-cases&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&
Netflex 去年的公开数据 说 已经超过一共 超过 2000 个 nodes,当然是多个集群。 我个人很少听说公司 in production 真的用了很多nodes补充公开的use case :
不考虑索引的数据单个个体大小仅说索引的数量没有意义。譬如同样配置下,搜索服务器能高性能支撑查询文档附件的内容索引数量肯定远小于只是索引了一些数据库条目的索引数量。&br&同时这个数量还取决于你服务器的配置,内存,存储IO性能。还取决于你的索引数据划分策略,备份方案。还取决于你要求的搜索性能,以及你们用户的使用搜索的习惯
不考虑索引的数据单个个体大小仅说索引的数量没有意义。譬如同样配置下,搜索服务器能高性能支撑查询文档附件的内容索引数量肯定远小于只是索引了一些数据库条目的索引数量。同时这个数量还取决于你服务器的配置,内存,存储IO性能。还取决于你的索引数据划…
SELECT product, COUNT(DISTINCT seller) as num_sellers&br&FROM transaction_log&br&GROUP BY product&br&ORDER BY num_&br&&br&是这个意思吗?
SELECT product, COUNT(DISTINCT seller) as num_sellersFROM transaction_logGROUP BY productORDER BY num_是这个意思吗?
你刚刚安装了hadoop就要整合这一堆东西,太急了吧。而且你没有具体需求,只是泛泛而谈。
你刚刚安装了hadoop就要整合这一堆东西,太急了吧。而且你没有具体需求,只是泛泛而谈。
如果你对语言有成见,你可以多学一些语言,可以在一个项目中使用多个语言。搜索这个是比较低端的,没必要使用什么正式的语言,用shell就行。
如果你对语言有成见,你可以多学一些语言,可以在一个项目中使用多个语言。搜索这个是比较低端的,没必要使用什么正式的语言,用shell就行。
搜索领域里,可以从doc开始理解。经过分词组建tokenizer时,会做分词 去标点符号 去停用词 此过程叫做tokenize。结束后得到的结果叫做token,然后token会被送到语言处理组件,比如说 大写转为小写 复数变为原词 这个过程叫做stemming,将单词变成词根如drove转成drive 这个过程叫做lemmatization ,经历了stemming和lemmatization之后,得到的词就是所谓的term。再往后就是倒排表了
搜索领域里,可以从doc开始理解。经过分词组建tokenizer时,会做分词 去标点符号 去停用词 此过程叫做tokenize。结束后得到的结果叫做token,然后token会被送到语言处理组件,比如说 大写转为小写 复数变为原词 这个过程叫做stemming,将单词变成词根如drov…
题主问题描述不是很清楚。猜测原因可能如下&br&1.solrCloud的配置文件交于zookeeper同步的。题主采用统一模版创建的collection的,collection的solrconfig.xml里面写死了主从core信息。可以检查一下。
题主问题描述不是很清楚。猜测原因可能如下1.solrCloud的配置文件交于zookeeper同步的。题主采用统一模版创建的collection的,collection的solrconfig.xml里面写死了主从core信息。可以检查一下。
基于Lucene4.6+Solr4.6+Heritrix1.14+S2SH实战开发从无到有垂直搜索引擎&br&百度网盘下载:链接:&a href=&///?target=http%3A///s/1bowbZLt& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/s/1bowbZL&/span&&span class=&invisible&&t&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& 密码:u6tx
基于Lucene4.6+Solr4.6+Heritrix1.14+S2SH实战开发从无到有垂直搜索引擎百度网盘下载:链接: 密码:u6tx
你的字段没有存储起来,如下: &b&stored=&true& 表示存储&/b&&br&&field name=&type& type=&string& indexed=&true& stored=&true& multiValued=&false&/&
你的字段没有存储起来,如下: stored="true" 表示存储&field name="type" type="string" indexed="true" stored="true" multiValued="false"/&
真到了PB级就要优化了
真到了PB级就要优化了
负责任的话用%like% + 纠正,不负责任就直接用开源产品。&br&&br&淘宝不负责任地用开源产品,导致后果就是如果用户搜索的词不在淘宝的索引列表中,那么就算有这个词也搜不到。
负责任的话用%like% + 纠正,不负责任就直接用开源产品。淘宝不负责任地用开源产品,导致后果就是如果用户搜索的词不在淘宝的索引列表中,那么就算有这个词也搜不到。
都用solr就行啦
都用solr就行啦
solr本就支持基础的数据过滤:&br&&br&数值型字段直接用Field:[valueA TO valueB]&br&&br&你例子中的保障、授权只是一个字段而已,单值、多值都可以&br&&br&solr的facet可以直接统计每一个选项的数量,facet设置!ex和!tag可以生产复杂多变的组合过滤条件;facet.pivot可以实现分组再分组统计&br&&br&group可以实现分组去重复、分页&br&&br&dismax/edismax中bq、bf可以实现你想要的复杂排序,非常复杂都可以&br&&br&solr的ValueSourceParser和ValueSource可以实现自定义排序计算函数&br&&br&继承DefaultSimilarity,可以实现自定义的分词得分计算,重载tf、idf、queryNorm等等在空间向量模型中至关重要的方法
solr本就支持基础的数据过滤:数值型字段直接用Field:[valueA TO valueB]你例子中的保障、授权只是一个字段而已,单值、多值都可以solr的facet可以直接统计每一个选项的数量,facet设置!ex和!tag可以生产复杂多变的组合过滤条件;facet.pivot可以实现分组再…
为什么不把价格放到索引里?明明有range查询你不用
为什么不把价格放到索引里?明明有range查询你不用
Jetty vs. Tomcat&br&We recommend staying with Jetty when first learning Solr. If your organization uses&br&Tomcat or some other Java web-application server, such as Resin, you can deploy the&br&Solr WAR file. Because we’re getting to know Solr in this chapter, we’ll refer you to&br&chapter 12 to learn how to deploy the Solr WAR file.&br&Solr uses Jetty to make the initial setup and configuration process a no-brainer. But&br&this doesn’t mean that Jetty is a bad choice for production deployment. If your organization&br&already has a standard Java web-application platform, then Solr will work&br&with it. But if you have some choice, then we recommend you try out Jetty. It’s fast,&br&stable, mature, and easy to administer and customize. In fact, Google uses Jetty&br&for its App Engine—see &a href=&///?target=http%3A//q.com/news/2009/08/google-chose-jetty/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Google Chose Jetty for App Engine&i class=&icon-external&&&/i&&/a&—which&br&gives great credibility to Jetty as a solid platform for running Solr in even the most&br&demanding environments!&br&&i&&b&from 《Solr in Action》&/b&&/i&
Jetty vs. TomcatWe recommend staying with Jetty when first learning Solr. If your organization usesTomcat or some other Java web-application server, such as Resin, you can deploy theSolr WAR file. Because we’re getting to know Solr in th…
solr 有提供全匹配的搜索,加双引号。
solr 有提供全匹配的搜索,加双引号。
建议使用Elasticsearch和solr一样,使用lucene&br&这个和php无关,因为无论哪个工具,都是通过网络接口查询,所以我不回答有关是否适合php的情况~~&br&&br&## ES 缺点&br&基于java,会有一些java的常见问题需要注意,比如gc&br&单纯执行速度上比C写的sphinx慢&br&&br&## sphinx 优点&br&纯粹,没有什么花哨的其他功能&br&C写的,速度快&br&新版本加了分布式索引、动态更新索引等功能&br&&br&## 下面列举Es比sphinx优秀的部分&br&1、部署简单,虽然sphinx部署也挺简单,但是在书写配置的时候,你会发现,sphinx的配置是要写好后,重启sphinx,而Elasticsearch针对某个索引的配置,是可以动态写入的。&br&2、调试简单,sphinx有命令行工具可以调试,而Elasticsearch使用的是http接口进行调试,不需要专门的API类,几行php代码就可以写一个Elasticsearch的API。&br&3、可视化工具比较多,有收费的,也有免费的,比如kibana head marvel。&br&4、提供结构化的JSON查询语句,易读性强&br&5、Es可以保留源数据(可选),也就是说,你可以不需要mysql的支持,就可以完成整个搜索过程,即使你不需要这个功能,在调试的时候,还是让人感到非常便利,不用将查询结果到数据库匹配一下。&br&6、Es可以动态更新全文索引,动态更新单个记录,而不像sphinx一样需要重建全部&br&7、对UTF8的支持是不需要单独配置的,天生为各种自然语言设计,而不仅仅是欧系语言&br&&br&## 从中文分词上来说&br&首先我觉得分词最重要的基本都是词库,分词算法两个工具基本都可以使用。&br&lucene 支持很多分词工具,比如&br&word &a href=&///?target=https%3A///ysc/word& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/ysc/word&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&比如ik &a href=&///?target=https%3A///medcl/elasticsearch-analysis-ik& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/medcl/elasti&/span&&span class=&invisible&&csearch-analysis-ik&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&这两个工具最近都很活跃,因为Es更新2.0 和 2.1&br&&br&比较分词区别(sphinx可能有误):&br&sphinx分词 我不太熟悉它的机制,多数情况下我使用scws分词,发送给sphinx,然后设置匹配规则,比如最大匹配&br&&br&Es的全文索引是基于分词的,也就是事先分好词,每个词对应某些记录,自动进行TF/IDF的运算,得到一个评分后返回,当然这个评分可以改(sphinx同样支持修改评分)&br&&br&另一方面ES也支持类似sphinx的匹配方式,模糊匹配,一般会一起使用,一个词不在分词库中的时候,或者用户写错了,就用fuzzy,所以Es在功能上,应该和sphinx不会有太多差别,而且要更多。&br&&br&## 后期维护上:&br&sphinx的配置文件在mysql分表之后,维护起来是比较麻烦的,你可以用php脚本当做配置文件,这样会好很多。&br&Es的索引是可以主动发给它去建立的(通过http接口),分表之后,它不关心数据库状态和结构。新增字段可以热更新。&br&&br&## 扩展性上:&br&Es和sphinx都支持分布式索引,扩展性都没有问题&br&两者都支持别名,Es的别名加上动态建立索引,使得更换索引结构或者重建索引后,支持0宕机时间。而sphinx的rotate选项可以动态更新索引(不知道能不能动态创建索引,因为sphinx我在使用的时候,索引都要求写在配置文件里。&br&性能方面没有测试数据。从直观感受上sphinx要快一些。&br&&br&## 文档方面&br&感觉两个工具都差不多,中文资料一般般,英文资料很全。
建议使用Elasticsearch和solr一样,使用lucene这个和php无关,因为无论哪个工具,都是通过网络接口查询,所以我不回答有关是否适合php的情况~~## ES 缺点基于java,会有一些java的常见问题需要注意,比如gc单纯执行速度上比C写的sphinx慢## sphinx 优点纯粹…
搬运工吧,n久前也纠结在搜索工具的选择上,把我收藏的连接分享给你:&br&&a href=&///?target=http%3A///en/system/Solr%253BSphinx& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Solr vs. Sphinx Comparison&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///questions/737275/comparison-of-full-text-search-engine-lucene-sphinx-postgresql-mysql& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Comparison of full text search engine&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///questions/2271600/elasticsearch-sphinx-lucene-solr-xapian-which-fits-for-which-usage/288211& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ElasticSearch, Sphinx, Lucene, Solr, Xapian. Which fits for which usage?&i class=&icon-external&&&/i&&/a&&br&&br&偷懒不想看英文的话,就看下这个中文的:&br&&a href=&///?target=http%3A///blog/1560834& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&主流全文索引工具的比较( Lucene, Sphinx, solr, elastic search)&i class=&icon-external&&&/i&&/a&&br&&br&-------------------------------------------------------------&br&最后我选择的是lucene......至于为什么不用solr,因为我有强迫症,想从底层了解起来,solr加了很多特性功能以应付企业级的搜索需求,相当于对lucene做了一个更高级的包装,但有时候Lucene很多新特性不能及时向上传递,so,我只是想更知道的知道基础是啥,果断是lucene。&br&&br&-------------------------------------------------------------&br&感觉答非所问&&!!
搬运工吧,n久前也纠结在搜索工具的选择上,把我收藏的连接分享给你:偷懒不想看英文的话,就看下这个中文的:
建议用solr,业界用的多,各种坑都淌过,分片也算方便
建议用solr,业界用的多,各种坑都淌过,分片也算方便
已有帐号?
社交帐号登录
无法登录?
社交帐号登录}

我要回帖

更多关于 solr 多core查询 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信