導航:首頁 > 凈水問答 > lucene過濾重復

lucene過濾重復

發布時間:2022-11-06 19:03:30

⑴ lucene 多個 filter 怎麼同時過濾

BooleanQuerybooleanQuery=newBooleanQuery();
booleanQuery.add(newBooleanClause(NumericRangeQuery.newIntRange("age",18,Integer.MAX_VALUE,true,true),BooleanClause.Occur.MUST));
booleanQuery.add(newBooleanClause(newTermQuery(newTerm("sex","男")),BooleanClause.Occur.MUST));

Filterfilter=newQueryWrapperFilter(booleanQuery);

searcher.search(query,filter,20);

//用的是容lucene4.10.3

⑵ lucene.net TopScoreDocCollector 分頁查詢出現重復數據,求高手指教

這有兩種情況,一:看是否是前一頁的最後一篇文檔和這頁的最上面的一篇文檔重復;二是你建索引的時候就有文檔重復的情況。

⑶ 如何用lucene實現正則表達式查詢

在輸出的document上進行二次判斷過濾,支持數值比較,字元串模糊查詢,正則式查詢,或則其他更復雜的查詢都沒問題。 但這種方式,是對lucene輸出結果的過濾,不是lucene核心的功能。

⑷ lucene搜索的時候可以去掉重復的索引只取一條嗎

這個可能是對資料庫里的同一條記錄建了多次索引就出現重復的了。 maxrocray 寫道 理論上內當容然是可以的。 不過你要寫個比較復雜的filter,對重復的索引的那個不同的field進行過濾。 過濾的規則,我想會根據你這個重復的索引的情況而定,可能會很復雜。 所以,常規來說,我們會對索引進行優化和整理,不允許重復的索引。

⑸ lucene檢索,必須完全包含我篩選的關鍵字,只包含其中一個字的要過濾掉,怎麼設置

這個要看你的搜索關鍵詞是什麼,採用的分詞器是什麼,比如你搜索的關鍵詞是「搜索引擎」,如果採用的分詞器的分詞結果就包含「搜索引擎『這個詞,那麼採用TermQuery就可以了;如果採用的分詞器的分詞結果不是「搜索引擎『這個詞,而是」搜索「和」引擎「這兩個詞,那麼要採用PhraseQuery,setSlop(0),這樣就可以搜索出同時包含」搜索「和」引擎「這兩個詞並且這兩個詞緊挨著的所有文章了。

⑹ 如何提高lucene的效率

如何提高Lucene的搜索速度 譯自http://wiki.apache.org/lucene-java/ImproveSearchingSpeed 這里討論了提高基於Lucene的應用程序搜索速度的幾種方法。如果你想提高索引的速度請閱讀「如何提高Lucene構建索引的速度」。 首先確定你需要加快搜索速度。這里的很多方法很容易嘗試但是有些會增加你程序的復雜性。所以請首先確定搜索速度確實太慢而且速度問題確實是Lucene導致的。 確保你使用的是最新版本的Lucene。 使用本地文件系統。 遠程文件系統搜索的速度總是會慢一些。如果你的索引必須放在遠程文件系統之上那麼可以考慮把遠程文件系統用「只讀方式」載入mount。某些時候這會改善性能。 使用更快的硬體尤其是更快的IO系統。 固態硬碟solid-state diskSSD非常適合Lucene的搜索。SSD的尋道時間大概是傳統磁碟式硬碟的100倍也就是說常見的尋道時間造成的開銷幾乎可以忽略掉了。也就是說裝有SSD的機器無需太多的內存作為文件緩存搜索器在允許反應之前需要的預熱warm-up時間更短。 調節操作系統。 Linux可以調節的一個典型的參數是swappiness參看http://kerneltrap.org/node/3000譯注可理解為交換系統調節物理內存和交換分區使用傾向的這個參數控制了操作系統把內存交換出到IO緩存的傾向性。這個參數在大多數Linux發行版中的默認設置都是一個很大的數也就是說傾向於交換分區這容易造成嚴重的搜索延遲特別是在查詢頻率不高的情況下搜索一個大的索引時。請嘗試把swappiness調低甚至關閉把它設置為0。Windows也有一個選框在我的電腦-屬性-高級-性能設置-內存使用允許你選擇傾向於應用程序還是系統緩存好像也是起這個作用的。 使用readOnlytrue選項打開IndexReader。 在多線程共享同一個reader的時候這將起巨大的作用因為這樣會去掉處理線程沖突的代碼。 在非Windows平台使用NIOFSDirectory取代FSDirectory。 這樣訪問這些文件的時候也會去掉處理線程沖突的代碼。不幸的是由於Sun JRE Windows版本長期存在的bughttp://bugs.sun.com/bugdatabase/view_bug.dobug_id6265734NIOFSDirectory在Windows下表現很差。 使用IndexSearcher的同一個實例。 在程序的查詢和線程之間使用單一的一個IndexSearcher的實例。 測量性能的時候忽視第一條查詢。 對搜索器的第一次查詢要付出初始化緩存的代價特別是按照欄位排序的時候會干擾你的結論假設你重用搜索器進行多次查存。另外一方面如果你一遍遍的重復同樣的查詢結論也會被扭曲因為操作系統會使用它的緩存加速IO操作。Linux核心2.6.16或者更新版本下你可以用命令 sync echo 3 /proc/sys/vm/drop_caches 來清空緩存。參見http://linux-mm.org/Drop_Caches。 僅在需要的時候重新打開IndexSearcher。 只有在需要讓最新提交的更新出現在搜索中的時候才應該重新打開IndexSearcher。注意重新打開搜索器有它的開銷在大的索引和排序打開的情況下可以被察覺到的必須將這一開銷最小化。可以考慮在面對第一個查詢之前使用預熱技術對緩存進行預熱。 搜索前對你的索引進行優化optimize。 優化optimize過的索引只有一個段這樣通常比多個段速度快得多尤其是對於大的索引。如果你的程序不經常更新索引那麼最好是先構建索引然後優化使用優化過的索引進行搜索。如果你的索引更新頻率很高而且更新後就要刷新搜索器的話那麼優化對你的開銷就太大了你可以採用降低合並因子的方法。 降低合並因子mergeFactor。 小的合並因子意味著更少的段和更快的搜索。然而這將降低索引的速度所以你應該測試這個值直到找到對於你的程序滿足平衡的值。 限制保存欄位和詞向量的使用。 從索引中獲取這些信息開銷太大。一般來說你應該只獲取用戶看前可見的「頁」內的條目的這些信息而不是整個結果集的。針對每個獲取的文檔Lucene必須尋道到不同文件的不同位置。嘗試首先用docID排序你要獲取的文檔譯注有可能提高尋道效率。 在你獲取一個文檔時使用FieldSelector仔細的選擇要載入哪些欄位以及如何載入他們。 不要枚舉比所需命中結果更多的結果。 枚舉所有的命中很慢有兩個原因。首先返回Hits對象的search方法在你需要超過100個命中的時候需要內部重新執行搜索。解決方法用帶有HitCollector的search方法代替。其次命中通常遍布磁碟的每個角落訪問全部需要大量的I/O活動。這很難避免除非索引小到可以直接放到內存里。如果你不需要完整的文檔而只需要一個小的欄位那麼你可以用FieldCache類來緩存它這樣就可以告訴訪問它了。 使用模糊查詢fuzzy query的時候設置最小的前綴長度。 模糊查詢執行耗費CPU的字元串比較——要避免將用戶輸入的詞和所有的索引的詞項進行比較應該只比較前「N」個字元相同的詞項。前綴長度是QueryParser和FuzzyQuery都有的參數默認為0所有的詞項都要比較。 考慮使用過濾器filter。 把結果限定在索引的一部分時使用緩存的位域過濾器比使用查詢條件高效得多。尤其是在限制條件包含了一個大索引的大量文檔時。過濾器通常用於限定一個分類下的結果但是可以在很多中情況下替代任何查詢條件。查詢和過濾之間的一個區別在於查詢影響結果評分過濾不影響。 找到瓶頸。 復雜的查詢分析或者對結果過度處理是隱藏的搜索瓶頸的例子。使用VisualVM這樣的工具profile程序可以幫助定位這些問題。

⑺ lucene5.0自定義過濾器如何使用

「石頭」跟生來化棉起到的源只是維持硝化系統的作用,而硝化系統的作用是分解NH3等水體中有毒有害物質,這個跟你所說的水體清澈無關。水體里固體廢物的過濾還是需要物理過濾,即過濾棉/白棉。你看到的沒有濾棉的過濾很可能是用了前置濾桶,裡面全是濾棉?

⑻ lucene 怎麼在query完成後進行過濾去重

Query中抽象類,TermQuery只是多個其具體實現之一而已。如果還不明白,就查一下什麼是抽象灰。

⑼ Lucene3.0如何防止索引被重復創建

lucene3.0建索引的構造方法為:
new
IndexWriter(Directory
d,
Analyzer
a,
boolean
b);
b為true的時候意思是重建索引,也就是刪除之前的索引重新建立索引。
b為false的時候意思是增量創建索引,就是該目錄下有索引我就再創建一遍,沒有的話就報錯。
我做索引的時候就寫的是ture。

⑽ lucene通過文件內容查詢文件路徑出現重復記錄,怎麼解決

建索引代碼:
private Document[] fileContentConvertDoc() {
File f = new File(fileLuceneConfig.getDocFilePath());
List<File> allowFiles = new LinkedList<File>();
allowFiles = getAllowFiles(f, allowFiles);
Document[] documents = new Document[allowFiles.size()];
int i = 0;
for (File tmp : allowFiles) {
this.baseExtractor = AbstractExtractorFactory.getBaseExtractor(tmp
.getName());
documents[i] = new Document();
// 文件名,不分詞的索引,但存儲
documents[i].add(new Field("fileName", tmp.getName(),
Field.Store.YES, Field.Index.NOT_ANALYZED));
// 文件絕對路徑,不索引,但存儲
documents[i].add(new Field("filePath", tmp.getAbsolutePath(),
Field.Store.YES, Field.Index.NO));
// 文件內容,分詞索引,但不存儲,根據路徑來載入
try {
documents[i].add(new Field("fileContent", baseExtractor
.getContent(new FileInputStream(tmp)), Field.Store.NO,
Field.Index.ANALYZED));
} catch (FileNotFoundException e) {
log.debug(new StringBuffer("文件名為:").append(tmp.getName()).append("的文件沒有找到,無法對該文件內容建立索引!"));
}
i++;
}
return documents;
}

public void indexDocs() {
FSDirectory fsDirectory = null;
try {
fsDirectory = FSDirectory.open(new File(luceneConfig.getIndexDirPath()));
RAMDirectory ramDirectory = new RAMDirectory();
IndexWriter fsWriter = new IndexWriter(fsDirectory, AnalyzerFactory.getAnalyzer(luceneConfig), true, MaxFieldLength.UNLIMITED);
IndexWriter ramWriter = new IndexWriter(ramDirectory, AnalyzerFactory.getAnalyzer(luceneConfig), true, MaxFieldLength.UNLIMITED);
Document[] documents = this.luceneConfig.getAbstractDocument().getDocuments();這里實際就是調用上面那個方法將每個目標目錄下每個文件構建成單獨的Document
int i = 0;
for (Document d : documents) {
ramWriter.addDocument(d);
if (i % 10 == 0) {
fsWriter.addIndexesNoOptimize(new Directory[]{ramDirectory});
ramWriter.close();
ramWriter = new IndexWriter(ramDirectory, AnalyzerFactory.getAnalyzer(luceneConfig), MaxFieldLength.UNLIMITED);
}
fsWriter.optimize();
fsWriter.commit();
}
fsWriter.close();
ramWriter.close();
} catch (IOException e) {
e.printStackTrace();
}

搜索代碼:通過fileContent內容找出對應的filePath
public String[] searchDoc(SearchModel searchModel, String returnField) {
try {
Analyzer analyzer = AnalyzerFactory.getAnalyzer(luceneConfig);
QueryParser parser = new QueryParser(Version.LUCENE_30,searchModel.getSearchField(),analyzer);
Query query = parser.parse(searchModel.getSearchContent());

IndexSearcher seacrcher = new IndexSearcher(FSDirectory.open(new File(luceneConfig.getIndexDirPath())),true);
TopDocs ts = seacrcher.search(query,null,100);
int totalHits = ts.totalHits;
ScoreDoc[] scoreDocs = ts.scoreDocs;
String[] values = new String[scoreDocs.length];
for (int i = 0; i < scoreDocs.length; i++) {
//根據命中的文檔的內部編號獲取該文檔
Document hitDoc = seacrcher.doc(scoreDocs[i].doc);
//獲取該文檔指定域的值
values[i] = hitDoc.getField(returnField).stringValue();
System.out.println(values[i]);
}
return values;
}catch (FileNotFoundException e) {
if (-1 < e.getMessage().indexOf("no segments* file found")) {
log.error(new StringBuffer(luceneConfig.getIndexDirPath()).append("目錄沒有索引文件!"));
}
} catch (ParseException e) {
e.printStackTrace();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

public static void main(String[] args) {
FileLuceneConfig fileLuceneConfig = new FileLuceneConfig("E:\\Lucene\\test\\target");
fileLuceneConfig.setIndexDirPath("E:\\Lucene\\test\\index\\file");//這是索引存放目錄
fileLuceneConfig.setAnalyzerType("SC");

SearchModel searchModel = new SearchModel("人民","fileContent");
LuceneSearcher luceneSearcher = new LuceneSearcher(fileLuceneConfig);
luceneSearcher.searchDoc(searchModel,"filePath");
}

查詢結果,有重復記錄:
E:\Lucene\test\target\c.txt
E:\Lucene\test\target\b.txt
E:\Lucene\test\target\b.txt
這里,我們先不管分詞器如何分詞,我希望出來的結果應該是:
E:\Lucene\test\target\c.txt
E:\Lucene\test\target\b.txt
不會出現兩條E:\Lucene\test\target\b.txt記錄,請高手指定,為什麼這里會有重復,如何做才能得到不重復的記錄呢?

閱讀全文

與lucene過濾重復相關的資料

熱點內容
高效空氣過濾器製作 瀏覽:743
機油濾芯一般多少油 瀏覽:691
臭氣凈化器怎麼製作 瀏覽:521
油煙凈化器芯體是什麼意思 瀏覽:372
德龍咖啡機除垢後水 瀏覽:512
醫療廢水戊二醛的處置 瀏覽:178
魚缸海沙過濾 瀏覽:680
污水d和a是什麼意思 瀏覽:143
蒸餾時需要調ph嗎 瀏覽:772
如何清理浴室地板水垢 瀏覽:512
魚缸過濾棒入缸 瀏覽:307
潮陽和平鎮污水處理廠 瀏覽:868
變頻器污水提升泵操作規程 瀏覽:5
純水機什麼廠家好 瀏覽:136
人和怡寶純凈水電話多少 瀏覽:944
ro膜干膜和濕膜的區分 瀏覽:493
污水處理工培訓小結 瀏覽:237
污水處理廠脫泥有哪些好處 瀏覽:407
五道過濾器超濾膜 瀏覽:953
飛利浦凈化器維修需要什麼 瀏覽:738