Lucene&&Solr中的域(Filed)總結
引言
Field類是文件索引期間很重要的類,控制著被索引的域值,下面先來看幾種常用的域型別:
下面對上面幾個屬相進行介紹
是否分詞:
分詞的作用是為了索引
需要分詞: 檔名稱, 檔案內容
不需要分詞: 不需要索引的域不需要分詞,還有就是分詞後無意義的域不需要分詞 比如: id, 身份證號
是否索引:
索引的的目的是為了搜尋.
需要搜尋的域就一定要建立索引,只有建立了索引才能被搜尋出來
不需要搜尋的域可以不建立索引
需要索引: 檔名稱, 檔案內容, id, 身份證號等
不需要索引: 比如圖片地址不需要建立索引, e:\\xxx.jpg,因為根據圖片地址搜尋無意義
是否儲存:
儲存的目的是為了顯示.
是否儲存看個人需要,儲存就是將內容放入Document文件物件中儲存出來,會額外佔用磁碟空間, 如果搜尋的時候需要馬上顯示出來可以放入document中也就是要儲存,這樣查詢顯示速度快, 如果不是馬上立刻需要顯示出來,則不需要儲存,因為額外佔用磁碟空間不划算.
在lucene中使用域
File[] listFiles = f.listFiles(); for (File file : listFiles) { // 第三步建立document物件 Document document = new Document(); String file_name = file.getName(); // 建立域 Field fileNameField = new TextField("fileName", file_name, Store.YES);
long file_size = FileUtils.sizeOf(file); Field fileSizeField = new LongField("fileSize", file_size, Store.YES); // 檔案路徑 String file_path = file.getPath(); Field filePathField = new StoredField("filePath", file_path); // 檔案內容 String file_content = FileUtils.readFileToString(file); Field fileContentField = new TextField("fileContent", file_content, Store.NO); document.add(fileNameField); document.add(fileSizeField); document.add(filePathField); document.add(fileContentField); // 第四步 使用 indexwriter物件將docum物件寫人索引庫,此過程進行索引建立。並將索引和document物件寫入索引庫 indexWriter.addDocument(document); }
Solr中域的介紹
域的使用
我們在新增索引的時候,使用域必須是在配置檔案中配置的,如果我們使用的索引在配置檔案中不存在,將會報錯,索引新增失敗,此時如果我們的需求要求我們必須使用這個域名,則我們需要自己在配置檔案新增這個域的定義,在對應的collection下面的schema.xml檔案中新增:
<field name="item_title" type="text_ik" indexed="true" stored="true"/>
<field name="item_sell_point" type="text_ik" indexed="true" stored="true"/>
<field name="item_price" type="float" indexed="true" stored="true"/>
<field name="item_num" type="int" indexed="true" stored="true"/>
<field name="item_image" type="string" indexed="false" stored="true"/>
動態域
為了更好的滿足我們在專案中的需求,在原有的配置檔案中,還有一些域採取了萬用字元的模式定義,這些域被稱為動態域,只要滿足這些域的模式,即可使用
<dynamicField name="*_i" type="int" indexed="true" stored="true"/>
<dynamicField name="*_is" type="int" indexed="true" stored="true" multiValued="true"/>
<dynamicField name="*_s" type="string" indexed="true" stored="true" />
<dynamicField name="*_ss" type="string" indexed="true" stored="true" multiValued="true"/>
<dynamicField name="*_l" type="long" indexed="true" stored="true"/>
<dynamicField name="*_ls" type="long" indexed="true" stored="true" multiValued="true"/>
<dynamicField name="*_t" type="text_general" indexed="true" stored="true"/>
<dynamicField name="*_txt" type="text_general" indexed="true" stored="true" multiValued="true"/>
<dynamicField name="*_en" type="text_en" indexed="true" stored="true" multiValued="true"/>
<dynamicField name="*_b" type="boolean" indexed="true" stored="true"/>
<dynamicField name="*_bs" type="boolean" indexed="true" stored="true" multiValued="true"/>
複製域
複製域的目的是將多個域合併為一個域,這樣我們按照多個條件查詢的時候,可以值傳送一個get請求就可以完成,如果我們定義了複製域,在我們儲存資料的時候,我們只負責儲存兩個域,但是實際上在索引庫中儲存了三個域,複製域就是solr內部自動合併的,定格式如下:
<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_title" dest="item_keywords"/>
<copyField source="item_sell_point" dest="item_keywords"/>
自定義域型別
<!-- IKAnalyzer -->
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
上面程式碼自定義了一個基於IK中文分詞器的域型別。
小結
域是全文搜尋的一個基礎,所以我們需要好好掌握這個概念,因為lucene是solr的基礎,所以在這小編將他們兩個放在一起介紹了,後面部落格中會繼續講解solr的相關知識