日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Lucene排序以及自定义排序

發(fā)布時(shí)間:2024/4/17 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lucene排序以及自定义排序 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

現(xiàn)在開(kāi)發(fā)搜索系統(tǒng),使用的是開(kāi)源界比較推崇的Lucene,版本是Maven庫(kù)上面的3.5,這個(gè)版本里面有很多方法都不建議使用了。所以代碼創(chuàng)建的方式
有那么點(diǎn)變化,我使用的分詞器是IkAnalyzer。Lucene全文檢索的功能是很強(qiáng)大的,我們?cè)谧鲭娮由虅?wù)系統(tǒng)的時(shí)候肯定是會(huì)遇到排序的問(wèn)題,比如
銷(xiāo)量,比如價(jià)格等等,為了方便客戶(hù)我們便需要Lucene的排序功能,其實(shí)Lucene中的排序很簡(jiǎn)單也很方便,我們?cè)趧?chuàng)建搜索器的時(shí)候增加一個(gè)Sort
就行了,Sort的構(gòu)造函數(shù)需要SortField,具體大家可以去參考Lucene的源代碼,我下面寫(xiě)了一個(gè)簡(jiǎn)單的例子來(lái)演示怎么使用。代碼如下:

import java.io.IOException; import java.util.Locale; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.Field.Index; import org.apache.lucene.document.Field.Store; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.search.FieldComparator; import org.apache.lucene.search.FieldComparatorSource; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.Sort; import org.apache.lucene.search.SortField; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.Version; import org.junit.Test; import org.wltea.analyzer.lucene.IKAnalyzer; import org.wltea.analyzer.lucene.IKQueryParser; import org.wltea.analyzer.lucene.IKSimilarity; public class LuceneSortTest { /** * Lucene排序查詢(xún) */ @Test public void testSort() throws Exception{ String name = "name"; String field = "price"; String names[] = {"衣服","睡衣","漂亮衣服","好看衣服","男士衣服","女士衣服"}; double price[] = {12.0,13.0,8.8,9.6,7.5,12.1}; RAMDirectory dir = new RAMDirectory(); Analyzer analyzer = new IKAnalyzer(); IndexWriterConfig cfg = new IndexWriterConfig(Version.LUCENE_35, analyzer); IndexWriter writer = new IndexWriter(dir, cfg); for (int i=0;i<names.length;i++) { Document doc = new Document(); doc.add(new Field(name, names[i], Store.YES, Index.ANALYZED)); doc.add(new Field(field, String.valueOf(price[i]), Store.YES, Index.NOT_ANALYZED)); writer.addDocument(doc); } writer.commit(); writer.close(); IndexReader reader = IndexReader.open(dir); Query query = IKQueryParser.parse(name, "衣服"); Sort sort = new Sort(new SortField(field,SortField.DOUBLE,true)); //排序 false 升序 true降序 IndexSearcher isearcher = new IndexSearcher(reader); isearcher.setSimilarity(new IKSimilarity()); TopDocs topDocs = isearcher.search(query, 5, sort); ScoreDoc scoreDocs[] = topDocs.scoreDocs; for (ScoreDoc scoreDoc : scoreDocs) { Document doc = isearcher.doc(scoreDoc.doc); System.out.println(doc.get(field)); } isearcher.close(); dir.close(); } }

在SortField里面有很多靜態(tài)常量來(lái)提供給排序器作為排序的依據(jù),Lucene里面自己定義好的排序?qū)崿F(xiàn)已經(jīng)基本能夠滿足我們的需求了,如果自己想定義一個(gè)自己的排序算法,那么可以繼承FieldComparatorSource實(shí)現(xiàn)里面的方法:

public FieldComparator newComparator(String fieldname, int numHits,int sortPos, boolean reversed) throws IOException {// TODO Auto-generated method stubreturn new DoubleFieldComparatorSource.DoubleFieldComparator();}

里面的FieldComparator是一個(gè)抽象類(lèi),主要就是用來(lái)作比較使用的,定義自己的排序算法關(guān)鍵也在于繼承這個(gè)抽象類(lèi),然后實(shí)現(xiàn)里面的方法,需要實(shí)現(xiàn)的方法如下:

class DoubleFieldComparator extends FieldComparator{@Overridepublic int compare(int slot1, int slot2) {return 0;}@Overridepublic void setBottom(int slot) {}@Overridepublic int compareBottom(int doc) throws IOException {return 0;}@Overridepublic void copy(int slot, int doc) throws IOException {ub}@Overridepublic void setNextReader(IndexReader reader, int docBase)throws IOException {}@Overridepublic Object value(int slot) {return null;}}

這里順便列出Sort已經(jīng)提供的比較值:

SortField.SCORE 按積分排序 SortField.DOC 按文檔排序 SortField.AUTO 域的值為int、long、float都有效 SortField.STRING 域按STRING排序 SortField.FLOAT SortField.LONG SortField.DOUBLE SortField.SHORT SortField.CUSTOM 通過(guò)比較器排序 SortField.BYTE

?

轉(zhuǎn)載于:https://www.cnblogs.com/lcuzhanglei/archive/2012/08/01/2618381.html

總結(jié)

以上是生活随笔為你收集整理的Lucene排序以及自定义排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。