⑴ solr索引文件 最大多少
請查看Lucene3.5源碼中 org.apache.lucene.index.IndexWriterConfig 的156行。
⑵ solr get請求大小
不用伺服器辯晌亮不同限制。
由於jsonp跨域請求只能通過get請求,url長度根據瀏覽器及服務謹灶器的不同而有不同限制。若要攜寬支持IE的話,最大的長度為2083字元,若是中文字元的話只有2083/9=231個字元。
⑶ Solr4.5 支持多大的數據索引
給你個測試結果,自己考慮
測試一:250萬記錄,300M左右文本,生成索引專380M左右,800線程下平屬均處理時間300ms。
測試二:37000記錄,索引資料庫中的兩個varchar欄位,索引文件2.6M,800線程下平均處理時間1.5ms。
⑷ 如何將solrconfig.xml中row行設置最大
本節詳細講解solrconfig.xml
1.如果配置文件配置錯誤,是否提示。true要報錯,false不報錯。
<abortOnConfigurationError>${solr.abortOnConfigurationError:true}</abortOnConfigurationError>
2.solr版本。
<信培luceneMatchVersion>LUCENE_31</luceneMatchVersion>
3. 索引文件目錄,建索引的目錄和查詢的目錄都是它。
<dataDir>${solr.data.dir:./solr/db/data}</dataDir>
4.一些基礎配置
4.1多少個document進行合並
<mergeFactor>10</mergeFactor>
<!-- Sets the amount of RAM that may be used by Lucene indexing
for buffering added documents and deletions before they are
flushed to the Directory. -->
4.2 緩存大小
<ramBufferSizeMB>32</ramBufferSizeMB>
多少個文檔自動合並
<mergeFactor>10</mergeFactor>
(回去了,下次再更新。。)
(接著上次的更新)
4.3.
設置域的最大長度
<maxFieldLength>10000</maxFieldLength>
設置寫鎖的延遲時間
<writeLockTimeout>1000</writeLockTimeout>
設置提交鎖的延遲
<commitLockTimeout>10000</commitLockTimeout>
4.4
直接更新的方法:滑賀唯即調用solr默認的url訪問。
<updateHandler class="solr.DirectUpdateHandler2">
自動提交的最大文檔數,最大時間
<autoCommit>
<maxDocs>10000</maxDocs>
<maxTime>1000</maxTime>
</autoCommit>拍跡
4.5包含所有查詢的參數設置 <query>
設置lru緩存
<filterCache class="solr.FastLRUCache"
size="16384"
initialSize="4096"
autowarmCount="4096"/>
設置查詢結果緩存
<queryResultCache class="solr.LRUCache"
size="16384"
initialSize="4096"
autowarmCount="1024"/>
設置文檔緩存
<documentCache class="solr.LRUCache"
size="16384"
initialSize="16384"/>
是否延遲載入索引域
<enableLazyFieldLoading>true</enableLazyFieldLoading>
設置查詢的最大doc數
<queryResultMaxDocsCached>500</queryResultMaxDocsCached>
這個參數暫時未用
<maxWarmingSearchers>2</maxWarmingSearchers>
假如用dataimport這solr自帶的導入數據命令時,的參數,即與資料庫對應的文件的位置
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">C:\solr-tomcat\solr\db\conf\db-data-config.xml</str>
</lst>
</requestHandler>
這個標簽是用來控制主索引伺服器,與從索引伺服器分發索引快照的所有屬性的
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="master">
<str name="replicateAfter">commit</str>
<str name="replicateAfter">startup</str>
<str name="confFiles">schema.xml,stopwords.txt,elevate.xml</str>
<str name="commitReserveDuration">00:00:60</str>
<str name="httpBasicAuthUser">345</str>
<str name="httpBasicAuthPassword">345</str>
</lst>
</requestHandler>
這個標簽和他的名字是一樣的,表示用於集群的組件所有參數
<searchComponent name="clustering"
enable="${solr.clustering.enabled:false}"
class="solr.clustering.ClusteringComponent" >
<!-- Declare an engine -->
<lst name="engine">
<!-- The name, only one can be named "default" -->
<str name="name">default</str>
<!-- Class name of Carrot2 clustering algorithm.
Currently available algorithms are:
* org.carrot2.clustering.lingo.LingoClusteringAlgorithm
* org.carrot2.clustering.stc.STCClusteringAlgorithm
See http://project.carrot2.org/algorithms.html for the
algorithm's characteristics.
-->
<str name="carrot.algorithm">org.carrot2.clustering.lingo.LingoClusteringAlgorithm</str>
<!-- Overriding values for Carrot2 default algorithm attributes.
For a description of all available attributes, see:
http://download.carrot2.org/stable/manual/#chapter.components.
Use attribute key as name attribute of str elements
below. These can be further overridden for indivial
requests by specifying attribute key as request parameter
name and attribute value as parameter value.
-->
<str name="LingoClusteringAlgorithm.desiredClusterCountBase">20</str>
<!-- The language to assume for the documents.
For a list of allowed values, see:
http://download.carrot2.org/stable/manual/#section.attribute.lingo.MultilingualClustering.defaultLanguage
-->
<str name="MultilingualClustering.defaultLanguage">ENGLISH</str>
</lst>
<lst name="engine">
<str name="name">stc</str>
<str name="carrot.algorithm">org.carrot2.clustering.stc.STCClusteringAlgorithm</str>
</lst>
</searchComponent>
當發生集群命令時,對應的相應參數。表示是否開啟集群等。
<requestHandler name="/clustering"
startup="lazy"
enable="${solr.clustering.enabled:false}"
class="solr.SearchHandler">
<lst name="defaults">
<bool name="clustering">true</bool>
<str name="clustering.engine">default</str>
<bool name="clustering.results">true</bool>
<!-- The title field -->
<str name="carrot.title">name</str>
<str name="carrot.url">id</str>
<!-- The field to cluster on -->
<str name="carrot.snippet">features</str>
<!-- proce summaries -->
<bool name="carrot.proceSummary">true</bool>
<!-- the maximum number of labels per cluster -->
<!--<int name="carrot.numDescriptions">5</int>-->
<!-- proce sub clusters -->
<bool name="carrot.outputSubClusters">false</bool>
<str name="defType">edismax</str>
<str name="qf">
text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4
</str>
<str name="q.alt">*:*</str>
<str name="rows">10</str>
<str name="fl">*,score</str>
</lst>
<arr name="last-components">
<str>clustering</str>
</arr>
</requestHandler>
默認查詢條件
<admin>
<defaultQuery>*:*</defaultQuery>
<!-- configure a healthcheck file for servers behind a
loadbalancer
-->
<!--
<healthcheck type="file">server-enabled</healthcheck>
-->
</admin>
⑸ solr每個數據節點最多能存多少,多大的數據
單個數據節點並無數據量的限制,整個集群能存多少數據取決於名稱節點的內存有多大,所存儲的單個文件的大小取決於整個集群所有數據節點的存儲容量之和有多大
⑹ java 判斷數據類型和方法的參數類型相同
1、如果你得到是一個Object對象,可以用if(obj instanceof String)來判斷是否是String對象,int是基本類型不可以這么判斷,只能用它的包裝類Integer,同樣用instanceof 。
2、如果set方法只能接受一個參數,而且必須有int的話,可以寫多個set方法,如set(String),set(int),編寫不同的處理邏輯。
3、instanceof 也是反射的一種方式。
4、如果有2個Object的參數,可以用if(obj1.getClass()==obj2.getClass())來判斷類型是否相同,如果要得到類型名,可以用obj.getClass().getName()來獲得對象的類名。
關於java數據類型的分類
Java基本類型共有八種,基本類型可以分為三類,字元類型char,布爾類型boolean以及數值類型byte、short、int、long、float、double。數值類型又可以分為整數類型byte、short、int、long和浮點數類型float、double。
JAVA中的數值類型不存在無符號的,它們的取值范圍是固定的,不會隨著機器硬體環境或者操作系統的改變而改變。實際上,JAVA中還存在另外一種基本類型void,它也有對應的包裝類 java.lang.Void,不過我們無法直接對它們進行操作。
8 中類型表示範圍如下:
byte:8位,最大存儲數據量是255,存放的數據范圍是-128~127之間。
short:16位,最大數據存儲量是65536,數據范圍是-32768~32767之間。
int:32位,最大數據存儲容量是2的32次方減1,數據范圍是負的2的31次方到正的2的31次方減1。
long:64位,最大數據存儲容量是2的64次方減1,數據范圍為負的2的63次方到正的2的63次方減1。
float:32位,數據范圍在3.4e-45~1.4e38,直接賦值時必須在數字後加上f或F。
double:64位,數據范圍在4.9e-324~1.8e308,賦值時可以加d或D也可以不加。
boolean:只有true和false兩個取值。
char:16位,存儲Unicode碼,用單引號賦值。
⑺ solr內存調優
在使用使用solr時,當我們的數據量比較大時,我們就要考慮對solr內存進行調優了,不然solr程序就會通過oom腳本將solr實例殺死,導致程序無法正常使用兆州。如果在使用塌鄭過程中遇到oom,可參考如下解決方案
這樣在solr啟動時就可以為JVM指定最小(-Xms)和最大(-Xmx)堆團猜頌大小
⑻ 如何用Solr搭建大數據查詢平台
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.e.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,修改為以下內容:
<dataConfig>
<dataSource name="sgk" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/newsgk" user="root" password="password" batchSize="-1" />
<document name="mysgk">
<entity name="b41sgk" pk="id" query="select * from b41sgk">
<field column="id" name="id"/>
<field column="username" name="username"/>
<field column="email" name="email"/>
<field column="password" name="password"/>
<field column="salt" name="salt"/>
<field column="ip" name="ip"/>
<field column="site" name="site"/>
</entity>
</document>
</dataConfig>
這個文件是負責配置導入數據源的,請按照mysql實際的設置修改datasource的內容,下面entity的內容必須嚴格按照mysql中社工庫表的結構填寫,列名要和資料庫中的完全一樣。
然後打開solrconfig.xml,先找到這一段:
<schemaFactory class="ManagedIndexSchemaFactory">
<bool name="mutable">true</bool>
<str name="managedSchemaResourceName">managed-schema</str>
</schemaFactory>
把它全部注釋掉,加上一行,改成這樣:
<!-- <schemaFactory class="ManagedIndexSchemaFactory">
<bool name="mutable">true</bool>
<str name="managedSchemaResourceName">managed-schema</str>
</schemaFactory>-->
<schemaFactory class="ClassicIndexSchemaFactory"/>
這是因為solr5 以上默認使用managed-schema管理schema,需要更改為可以手動修改。
然後我們還需要關閉suggest,它提供搜索智能提示,在社工庫中我們用不到這樣的功能,重要的是,suggest會嚴重的拖慢solr的啟動速度,在十幾億數據的情況下,開啟suggest可能會導致solr啟動載入core長達幾個小時!
同樣在solrconfig.xml中,找到這一段:
<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
<str name="name">mySuggester</str>
<str name="lookupImpl">FuzzyLookupFactory</str> <!-- org.apache.solr.spelling.suggest.fst -->
<str name="dictionaryImpl">DocumentDictionaryFactory</str> <!-- org.apache.solr.spelling.suggest. -->
<str name="field">cat</str>
<str name="weightField">price</str>
<str name="suggestAnalyzerFieldType">string</str>
</lst>
</searchComponent>
<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<str name="suggest">true</str>
<str name="suggest.count">10</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
</requestHandler>
把這些全部刪除,然後保存solrconfig.xml文件。
接下來把managed-schema拷貝一份,重命名為schema.xml (原文件不要刪除),打開並找到以下位置:
只保留_version_和_root_節點,然後把所有的field,dynamicField和Field全部刪除,添加以下的部分:
<field name="id" type="int" indexed="true" stored="true" required="true" multiValued="false" />
<field name="username" type="text_ik" indexed="true" stored="true"/>
<field name="email" type="text_ik" indexed="true" stored="true"/>
<field name="password" type="text_general" indexed="true" stored="true"/>
<field name="salt" type="text_general" indexed="true" stored="true"/>
<field name="ip" type="text_general" indexed="true" stored="true"/>
<field name="site" type="text_general" indexed="true" stored="true"/>
<field name="keyword" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<Field source="username" dest="keyword"/>
<Field source="email" dest="keyword"/>
<uniqueKey>id</uniqueKey>
這里的uniqueKey是配置文件中原有的,用來指定索引欄位,必須保留。新建了一個欄位名為keyword,它的用途是聯合查詢,即當需要同時以多個欄位做關鍵字查詢時,可以用這一個欄位名代替,增加查詢效率,下面的Field即用來指定復制哪些欄位到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部分加入以下內容:
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" useSmart="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<analyzer type="query" useSmart="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</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,就可以開始數據導入工作了。