日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Lucene全文检索

發(fā)布時間:2024/7/19 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lucene全文检索 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄結(jié)構(gòu):?
1.全文檢索?
2.Lucene入門?
3.Lucene進階

全文檢索

一, 生活中的搜索:
1.Windows系統(tǒng)中的有搜索功能:打開“我的電腦”,按“F3”就可以使用查找的功能,查找指定的文件或文件夾。搜索的范圍是整個電腦中的文件資源。

2.Eclipse中的幫助子系統(tǒng):點擊Help?Help Contents,可以查找出相關(guān)的幫助信息。搜索的范圍是Eclipse的所有幫助文件。
搜索引擎,如Baidu或Google等,可以查詢到互聯(lián)網(wǎng)中的網(wǎng)頁、PDF、DOC、PPT、圖片、音樂、視頻等。
3.Mac中的Spotlight搜索
4.數(shù)據(jù)庫中檢索檢查某一個關(guān)鍵字的例子。
select * from topic where content like ‘%java%’
文本檢索,會使索引失效

存在問題:
1.搜索速度慢
2.搜索效果不好.
3.沒有相關(guān)度排序

二, 什么是全文檢索?

全文檢索是指計算機索引程序通過掃描文章中的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現(xiàn)的次數(shù)和位置,當用戶查詢時,檢索程序就根據(jù)事先建立的索引進行查找,并將查找的結(jié)果反饋給用戶的檢索方式。這個過程類似于通過字典中的檢索字表查字的過程。

在說全文檢索之前我們先來了解一下數(shù)據(jù)分類

結(jié)構(gòu)化數(shù)據(jù):指具有固定格式或有限長度的數(shù)據(jù),如數(shù)據(jù)庫,元數(shù)據(jù)等;
半結(jié)構(gòu)化數(shù)據(jù):半結(jié)構(gòu)化數(shù)據(jù)
非結(jié)構(gòu)化數(shù)據(jù):指不定長或無固定格式的數(shù)據(jù),如郵件,word文檔等;
非結(jié)構(gòu)化數(shù)據(jù)又一種叫法叫全文數(shù)據(jù)。從全文數(shù)據(jù)中進行檢索就叫全文檢索。
特點:只關(guān)注文本不考慮語義

三, 為什么使用 ?
搜索速度:將數(shù)據(jù)源中的數(shù)據(jù)都通過全文索引

匹配效果:過詞元(term)進行匹配,通過語言分析接口的實現(xiàn),可以實現(xiàn)對中文等非英語的支持。

相關(guān)度:有匹配度算法,將匹配程度(相似度)比較高的結(jié)果排在前面。

適用場景:關(guān)系數(shù)據(jù)庫中進行模糊查詢時,數(shù)據(jù)庫自帶的索引將不起作用,此時需要通過全文檢索來提高速度;比如:
網(wǎng)站系統(tǒng)中針對內(nèi)容的模糊查詢;
select * from article where content like ‘%上海平安%’
ERP系統(tǒng)中產(chǎn)品等數(shù)據(jù)的模糊查詢,BBS、BLOG中的文章搜索等;
各種搜索引擎運行依賴于全文檢索;
只對指定領(lǐng)域的網(wǎng)站進行索引與搜索(即垂直搜索,如“818工作搜索”、“有道購物搜索”)
要在word、pdf等各種各樣的數(shù)據(jù)格式中檢索內(nèi)容;
其它場合:比如搜狐拼音輸入法、Google輸入法等。

四, 工作原理

1.如何查詢?nèi)臄?shù)據(jù)?

順序掃描法(Serial Scanning):所謂順序掃描,比如要找內(nèi)容包含某一個字符串的文件,就是一個文檔一個文檔的看,對于每一個文檔,從頭看到尾,如果此文檔包含此字符串,則此文檔為我們要找的文件,接著看下一個文件,直到掃描完所有的文件。比如Window自帶的搜索。
如何提升全文檢索的速度?

對非結(jié)構(gòu)化數(shù)據(jù)順序掃描很慢,對結(jié)構(gòu)化數(shù)據(jù)的搜索卻相對較快(由于結(jié)構(gòu)化數(shù)據(jù)有一定的結(jié)構(gòu)可以采取一定的搜索算法加快速度),那么把我們的非結(jié)構(gòu)化數(shù)據(jù)想辦法弄得有一定結(jié)構(gòu)不就行了嗎?關(guān)系數(shù)據(jù)庫中存儲的都是結(jié)構(gòu)化數(shù)據(jù),因此很檢索都比較快。
從非結(jié)構(gòu)化數(shù)據(jù)中提取出的然后重新組織的信息,我們稱之索引。
字典及圖書目錄的原理。

2.全文檢索的過程

索引創(chuàng)建:將現(xiàn)實世界中所有的結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)提取信息,創(chuàng)建索引的過程。
搜索索引:就是得到用戶的查詢請求,搜索創(chuàng)建的索引,然后返回結(jié)果的過程。

3.案例分析

索引文件中應該存放什么?
索引文件中只需要存放單詞及文檔編號即可
要查出即包含is,又包括 shanghai及pingan的文檔,先獲得包含is的文檔列表,再獲得包含shanghai及pingan的文檔列表,最合做一個集合并運算,就得出文檔1及文檔3。

文檔0
What is your name?
文檔1
My name is shanghai pingan!
文檔2
What is that?
文檔3
It is shanghai pingan, ShangHai Pingan

首先將我們非結(jié)構(gòu)化數(shù)據(jù)存儲到文檔區(qū)

文檔編號內(nèi)容
0What is your name?
1My name is shanghai pingan!
2What is that?
3It is shanghai pingan, ShangHai Pingan

如何建立索引?
第一步:分詞組件(Tokenizer)對文檔進行處理,此過程稱為Tokenize。
1. 將文檔分成一個一個單獨的單詞。(用空格分開)
2. 去除標點符號。
3. 去除停詞(Stop word)。大量出現(xiàn)的助詞,比如is,it等。中文:的,了,呢
經(jīng)過分詞(Tokenizer)后得到的結(jié)果稱為詞元(Token)。詞元(Token)如下:
shanghai,ShangHai,pingan,My,name,What,your,pingan

第二步:將得到的詞元(Token)傳給語言處理組件(Linguistic Processor),對于英語,處理大致如下:
1. 變?yōu)樾?Lowercase)。
2. 將單詞縮減為詞根形式,如“cars”到“car”等。這種操作稱為:stemming。
3. 將單詞轉(zhuǎn)變?yōu)樵~根形式,如“drove”到“drive”等。這種操作稱為:lemmatization。
語言處理組件(linguistic processor)的結(jié)果稱為詞(Term)。結(jié)果如下:
shanghai,pingan,my,name,what,your

第三步:把得到的詞Term傳給索引組件(Indexer)處理,處理過程如下:
1、把得到的詞創(chuàng)建一個字典表

詞term文檔Document
what0
name0
My1
name1
shanghai1
pingan1
what2
that2
shanghai3
pingan3
shanghai3
pingan3

2、對字典按字母順序進行排序

詞term文檔Document
shanghai1
shanghai3
shanghai3
pingan1
pingan3
pingan3
my1
name0
name1
what0
what2
your0

3、合并相同的詞(Term)成為文檔倒排(Posting List)鏈表。

詞term出現(xiàn)次數(shù)文檔Frequency文檔Frequency
shanghai31132
pingan31132
my111~~
name20111
what20121
your101~~

最終會存儲兩部分一個文檔區(qū)和一個索引區(qū)

詞元文檔編號
what0,2
your0
name0,1
my1
shanghai1,3,3
pingan1,3,3
that2

搜索處理的大致流程:
1、接收用戶輸入的搜索詞及關(guān)鍵字并作簡單處理;
2、對查詢語句進行詞法分析,語法分析,及語言處理;
3、查詢到包含輸出詞的文檔列表,并進行相關(guān)邏輯運算;
4、根據(jù)文檔的相關(guān)性進行排序,把相關(guān)性最高的文檔返回出來。

4.文檔相關(guān)性

計算詞的權(quán)重:
1、找出詞(Term)對文檔的重要性的過程稱為計算詞的權(quán)重(Term weight)的過程。主要有兩個因素:
A、Term Frequency (tf):即此Term在此文檔中出現(xiàn)了多少次。tf 越大說明越重要。
B、 Document Frequency (df):即有多少文檔包含該Term。df 越大說明越不重要。

2、判斷Term之間的關(guān)系從而得到文檔相關(guān)性的過程,也即向量空間模型的算法(VSM)。
實現(xiàn)方式:把文檔看作一系列詞(Term),每一個詞(Term)都有一個權(quán)重(Term weight),不同的詞(Term)根據(jù)自己在文檔中的權(quán)重來影響文檔相關(guān)性的打分計算

5.全文檢索應用架構(gòu)

6.全文檢索的流程對應的Lucene 實現(xiàn)的包結(jié)構(gòu)

Lucene 的analysis 模塊主要負責詞法分析及語言處理而形成Term。
Lucene的index模塊主要負責索引的創(chuàng)建,里面有IndexWriter。
Lucene的store模塊主要負責索引的讀寫。
Lucene 的QueryParser主要負責語法分析。
Lucene的search模塊主要負責對索引的搜索。

Lucene入門

Lucene是什么?

Lucene是一個用Java寫的高性能、可伸縮的全文檢索引擎工具包,它可以方便的嵌入到各種應用中實現(xiàn)針對應用的全文索引/檢索功能。Lucene的目標是為各種中小型應用程序加入全文檢索功能。

開發(fā)步驟

建立索引文件

1,創(chuàng)建一個測試類LuceneTest
2,導入jar包
lucene-core-4.10.4.jar 核心包
lucene-analyzers-common-4.10.4.jar 分詞器包
3,創(chuàng)建索引寫入器IndexWriter 傳入對應的參數(shù):索引需要存放的位置,索引寫入器配置對象(配置版本,分詞器)
4.內(nèi)容寫入之后,寫入到二進制文件中不方便查看,使用工具(lukeall-4.10.0.jar)查看索引庫

public class LuceneTest {String content1 = "hello world";String content2 = "hello java world";String content3 = "hello lucene world";String indexPath = "hello";Analyzer analyzer = new StandardAnalyzer();//分詞器@Testpublic void testCreateIndex() throws Exception {//1.創(chuàng)建索引寫入器Directory d = FSDirectory.open(new File(indexPath));//索引需要存放的位置//創(chuàng)建索引寫入器配置對象IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_4_10_4, analyzer);IndexWriter writer = new IndexWriter(d, conf);//2.寫入文檔信息//添加文檔 定義字段的存儲規(guī)則FieldType type = new FieldType();type.setIndexed(true);//是否要索引type.setStored(true);//是否需要存儲Document document1 = new Document();//數(shù)據(jù)庫中的一條數(shù)據(jù)//new Field("字段名","字段內(nèi)容","字段的配置屬性")document1.add(new Field("title", "doc1", type));//該條記錄中的字段 title:doc1document1.add(new Field("content", content1, type));//content: hello worldwriter.addDocument(document1);Document document2 = new Document();document2.add(new Field("title", "doc2", type));document2.add(new Field("content", content2, type));writer.addDocument(document2);Document document3 = new Document();document3.add(new Field("title", "doc3", type));document3.add(new Field("content", content3, type));writer.addDocument(document3);//需要把添加的記錄保存writer.commit();writer.close();} }

運行測試類會在該項目目錄下生成一個hello文件夾

打開_0.xfs文件,這時我們看不出一個所以然

使用工具(lukeall-4.10.0.jar)查看索引庫
只需在終端通過命令行 java -jar lukeall-4.10.0.jar 即可

需要在Path路徑上找到hello索引庫的絕對路徑

點擊OK即可看到索引庫

查詢索引庫

0.導入jar包lucene-queryparser-4.10.4.jar(將字符串變成Query對象)
1.創(chuàng)建測試方法searchIndex()
2.創(chuàng)建索引查詢對象IndexSearcher
3.根據(jù)查詢的文本內(nèi)容解析成Query查詢對象(導入jar包lucene-queryparser-4.10.4.jar)設(shè)置查詢字段,分詞器
4.根據(jù)查詢器查詢到文檔編號
5.通過文檔編號查詢對應的文檔內(nèi)容

//索引查詢過程 @Testpublic void searchIndex() throws Exception {//1.創(chuàng)建索引寫入器Directory d = FSDirectory.open(new File(indexPath));//創(chuàng)建分詞器Analyzer analyzer = new StandardAnalyzer();//打開索引目錄IndexReader r = DirectoryReader.open(d);//創(chuàng)建索引查詢對象IndexSearcher searcher = new IndexSearcher(r);QueryParser parser = new QueryParser("content", analyzer);Query query = parser.parse("hello");//查詢hello//search(查詢對象,符合條件的前n條記錄)TopDocs search = searcher.search(query, 10000);//n:前幾個結(jié)果System.out.println("符合條件的記錄有多少個:" + search.totalHits);ScoreDoc[] scoreDocs = search.scoreDocs;for (int i = 0; i < scoreDocs.length; i++) {System.out.println("*******************************");System.out.println("分數(shù):" + scoreDocs[i].score);//相關(guān)度的排序int docId = scoreDocs[i].doc;//文檔編號Document document = searcher.doc(docId);System.out.println("文檔編號 docId--->" + docId);System.out.println("標題內(nèi)容 title:--->" + document.get("content"));} }

打印結(jié)果:

常用API

Directory:索引目錄用于存放lucene索引文件
Directory是一個對索引目錄的一個抽象,索引目錄可以存放在普通的文件中,也可以位于數(shù)據(jù)庫,或其它的遠程服務中;一般情況下均使用文件來索引目錄,這時一個Directory就相當于一個文件夾。
SimpleFSDirectory:直接使用java.io.RandomAccessFile類來操作索引文件,在普通的Lucene應用中,可以直接使用SimpleFSDirectory。

SimpleFSDirectory類:直接使用java.io.RandomAccessFile類來操作索引文件,在普通的Lucene應用中,這是最簡單的用法。
構(gòu)造函數(shù):
SimpleFSDirectory(File path) :直接根據(jù)一個文件夾地址來創(chuàng)建索引目錄;
MMapDirectory(File path) :讓OS把整個索引文件映射到虛擬地址空間,這樣Lucene就會覺得索引在內(nèi)存中。

Document:當往索引中加入內(nèi)容的時候,每一條信息用一個子Document來表示,Document的意思表示文檔,也可以理解成記錄,與關(guān)系數(shù)據(jù)表中的一行數(shù)據(jù)記錄類似;
在Document創(chuàng)建完以后,直接調(diào)用其提供的字段操作方法來操作其中的字段對象。
Document提供的方法主要包括:
字段添加:add(Field field)
字段刪除:removeField、removeFields
獲取字段或值:get、getBinaryValue、getField、getFields等

**Field:**Field代表Document中的一行數(shù)據(jù),相當于一條Lucene記錄中的一列。
Lucene提供了一個接口Fieldable,其它的API大多針對這個接口編程,因此Lucene中的列對象實際上是由Fieldable來定義,實現(xiàn)該接口的除了Field類,還包括NumericField等。在實際開發(fā)中,主要使用的是Field類。
Field類提供的常用構(gòu)造方法:
1、Field(String name, String value, Field.Store store, Field.Index index) -通過字段名稱,字段值,存儲類型及索引方式來創(chuàng)建一個字段;
2、Field(String name, byte[] value, Field.Store store) -通過字段名稱、字段值(字節(jié)碼)及字段存儲方式創(chuàng)建字段對象;
3、Field(String name, Reader reader) -根據(jù)字段名稱及Reader對象創(chuàng)建字段對象;
4、其它構(gòu)造方法,詳情查看API。
new Field(“title”, “中國太平”, Store.NO, Index.ANALYZED);
new Field(“content”, “比較好的保險公司”, Store.YES, Index.ANALYZED);

**FieldType:**Lucene中,在創(chuàng)建Field的時候,可以指定Field的store及index屬性;
store屬性:表示字段值是否存儲,True表示要存儲,而False則表示不存儲;
type.setStored(true);//是否需要存儲在文檔區(qū)中
indexed屬性:表示字段的是否需要建立索引,即是否支持搜索。tokenized屬性:表示字段是否需要根據(jù)Analyzer規(guī)則進行分詞

創(chuàng)建FieldTest測試類(復制上面的類修改類名)
定義字段的存儲規(guī)則

FieldType type2 = new FieldType();type2.setIndexed(true);//該字段是否要索引type2.setStored(true);//是否需要存儲在文檔區(qū)中type2.setTokenized(false);//字段是否分詞type2.setTokenized(false);//字段是否分詞

設(shè)置所有的字段的配置屬性為type2

document1.add(new Field("content", content1, type2)); document2.add(new Field("content", content2, type2)); document3.add(new Field("content", content3, type2));public class FieldTest {String content1 = "hello world";String content2 = "hello java world";String content3 = "hello lucene world";String indexPath = "fieldType";Analyzer analyzer = new StandardAnalyzer();//分詞器//創(chuàng)建索引@Testpublic void testCreateIndex() throws Exception {//1.創(chuàng)建索引寫入器Directory d = FSDirectory.open(new File(indexPath));//索引需要存放的位置//創(chuàng)建索引寫入器配置對象IndexWriterConfig confg = new IndexWriterConfig(Version.LUCENE_4_10_4, analyzer);confg.setOpenMode(IndexWriterConfig.OpenMode.CREATE);//索引每次重新創(chuàng)建IndexWriter writer = new IndexWriter(d, confg);//2.寫入文檔信息//添加文檔 定義字段的存儲規(guī)則FieldType type = new FieldType();type.setIndexed(true);//該字段是否要索引type.setStored(true);//是否需要存儲type.setTokenized(true);FieldType type2 = new FieldType();type2.setIndexed(true);//該字段是否要索引type2.setStored(true);//是否需要存儲type2.setTokenized(false);//字段是否分詞Document document1 = new Document();//數(shù)據(jù)庫中的一條數(shù)據(jù)//new Field("字段名","字段內(nèi)容","字段的配置屬性")document1.add(new Field("title", "doc1", type));//該條記錄中的字段 title:doc1document1.add(new Field("content", content1, type2));//content: hello worldwriter.addDocument(document1);Document document2 = new Document();document2.add(new Field("title", "doc2", type));document2.add(new Field("content", content2, type2));writer.addDocument(document2);Document document3 = new Document();document3.add(new Field("title", "doc3", type));document3.add(new Field("content", content3, type2));writer.addDocument(document3);//需要把添加的記錄保存writer.commit();writer.close();} }

運行測試類?

查看索引庫?

?

當我們搜索用戶名或者地名希望是完整的詞元,不希望被分割,此時就可以設(shè)置該字段的tokenize屬性為false,設(shè)置不進行分詞
在索引庫中:
1.標題和內(nèi)容都通過分詞器進行索引了.
2.標題是完整儲存在文檔區(qū)中,內(nèi)容值截取前30個字符存儲在存儲區(qū)
3.文章ID只是存儲在文檔區(qū)但是沒有進行分詞
4.時間,作者,閱讀量,評論數(shù),來源是沒索引也沒存儲的

Analyzer(詞法分析器)

創(chuàng)建一個測試類AnalyzerTest?
封裝一個測試各個分詞器的方法analyzerMethod(Analyzer analyzer, String content);

public class AnalyzerTest {String en = "good morning boy";String ch = "你好 恭喜發(fā)財 東方明珠三生三世十里桃花";@Testpublic void analyzerMethod(Analyzer analyzer, String content) throws Exception {TokenStream tokenStream = analyzer.tokenStream("content", content);tokenStream.reset();while (tokenStream.incrementToken()) {System.out.println(tokenStream);}}//英文分詞器SimpleAnalyzer測試@Testpublic void testSimpleAnalyzer() throws Exception {analyzerMethod(new SimpleAnalyzer(), en);} }

英文分詞:?
SimpleAnalyzer:最簡單的詞法分析器,按英文單詞建立索引,以空格為分隔符;

//英文分詞器SimpleAnalyzer測試@Testpublic void testSimpleAnalyzer() throws Exception {analyzerMethod(new SimpleAnalyzer(), en);}

StandardAnalyzer:按英文單詞及中文字符來進行分析。

//英文分詞器StandardAnalyzer測試@Testpublic void testStandardAnalyzer() throws Exception {analyzerMethod(new StandardAnalyzer(), en);}

對于英文StandardAnalyzer也是采取空格進行分詞?
下面對中文進行分詞測試(對于中文他是單字分詞)

//英文分詞器StandardAnalyzer測試@Testpublic void testStandardAnalyzer() throws Exception {analyzerMethod(new StandardAnalyzer(), ch);}

PerFieldAnalyzerWrapper:

public void testPerFieldAnalyzerWrapper() throws Exception {Map<String, Analyzer> analyzerMap = new HashMap<>();analyzerMap.put("en", new SimpleAnalyzer());//使用SimpleAnalyzer分詞器analyzerMap.put("ch", new StandardAnalyzer());//使用StandardAnalyzer//設(shè)置默認分詞器PerFieldAnalyzerWrapper wrapper = new PerFieldAnalyzerWrapper(new SimpleAnalyzer(), analyzerMap);//會根據(jù)傳入的字段名在PerFieldAnalyzerWrapper找到這個字段對應的分詞器//如果PerFieldAnalyzerWrapper沒有該字段對應的分詞器就會應用默認的的分詞器//tokenStream("content", xxxxxxxxx);根據(jù)xxxxxx來判斷選擇的分詞器TokenStream tokenStream = wrapper.tokenStream("content", ch);tokenStream.reset();while (tokenStream.incrementToken()) {System.out.println(tokenStream);}}

中文分詞:?
StandardAnalyzer:單字分詞,把每一個字當成一個詞

//中文分詞器StandardAnalyzer測試 @Test public void testStandardAnalyzer() throws Exception {analyzerMethod(new StandardAnalyzer(), ch);}

CJKAnalyzer:二分法分詞,把相臨的兩個字當成一個詞,比如我們是中國人;我們,們是,是中,中國,國人等

//中文分詞器CJKAnalyzer測試 @Test public void testCJKAnalyzer() throws Exception { analyzerMethod(new CJKAnalyzer(), ch); }

SmartChineseAnalyzer:字典分詞,也叫詞庫分詞;把中文的詞全部放置到一個詞庫中,按某種算法來維護詞庫內(nèi)容;如果匹配到就切分出來成為詞語。通常詞庫分詞被認為是最理想的中文分詞算法。如:“我們是中國人”,效果為:“我們”、“中國人”。(可以使用SmartChineseAnalyzer,“極易分詞” MMAnalyzer ,或者是“庖丁分詞”分詞器、IKAnalyzer。推薦使用IKAnalyzer )

//中文分詞器SmartChineseAnalyzer測試 //需要導入jar包lucene-analyzers-smartcn-4.10.4.jar @Test public void testSmartChineseAnalyzer() throws Exception {analyzerMethod(new SmartChineseAnalyzer(), ch);} }

IKAnalyzer:第三方的?
1.導入jar包 IKAnalyzer2012FF_u1.jar(這個包在中央倉庫是沒有的)支持停詞和自定義拓展詞?
2.添加停詞詞典stopword.dic?
3.添加拓展詞典ext.dic

//中文分詞器IKAnalyzer測試 //需要導入jar包IKAnalyzer2012FF_u1.jar@Testpublic void testIKAnalyzer() throws Exception {analyzerMethod(new IKAnalyzer(), ch);}

如果想去掉”的”,”了”,”嗎”…..的語氣詞我們可以加入配置文件
IKAnalyzer.cfg.xml和stopword.dic

在stopword.dic文件里添加我們不需要的分詞即可,這樣拆分詞元就不會把這些停詞作為分詞了

我們?nèi)绻爰尤胍恍┪覀冏约盒枰脑~元則需要在配置文件IKAnalyzer.cfg.xml中配置一個額外分詞文件 拓展詞典ext.dic
在拓展詞典ext.dic中設(shè)置我們自定義的詞元

索引庫的更新

public class CRUDTest {String content1 = "hello world";String content2 = "hello java world";String content3 = "hello lucene world";String indexPath = "luncecrud";Analyzer analyzer = new StandardAnalyzer();//分詞器//創(chuàng)建索引@Testpublic void testCreateIndex() throws Exception {//1.創(chuàng)建索引寫入器Directory d = FSDirectory.open(new File(indexPath));//索引需要存放的位置//創(chuàng)建索引寫入器配置對象IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_4_10_4, analyzer);IndexWriter writer = new IndexWriter(d, conf);//2.寫入文檔信息//添加文檔 定義字段的存儲規(guī)則FieldType type = new FieldType();type.setIndexed(true);//是否要索引type.setStored(true);//是否需要存儲Document document1 = new Document();//數(shù)據(jù)庫中的一條數(shù)據(jù)//new Field("字段名","字段內(nèi)容","字段的配置屬性")document1.add(new Field("title", "doc1", type));//該條記錄中的字段 title:doc1document1.add(new Field("content", content1, type));//content: hello worldwriter.addDocument(document1);Document document2 = new Document();document2.add(new Field("title", "doc2", type));document2.add(new Field("content", content2, type));writer.addDocument(document2);Document document3 = new Document();document3.add(new Field("title", "doc3", type));document3.add(new Field("content", content3, type));writer.addDocument(document3);//需要把添加的記錄保存writer.commit();writer.close();testSearch();}@Testpublic void testUpdate() throws Exception {//創(chuàng)建索引寫入器Directory d = FSDirectory.open(new File(indexPath));IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_4, analyzer);IndexWriter writer = new IndexWriter(d, config);//更新對象Term term = new Term("title", "doc2");//更新的條件Document updateDoc = new Document();//更新之后的文檔對象FieldType type = new FieldType();type.setIndexed(true);type.setStored(true);updateDoc.add(new Field("title", "doc2", type));updateDoc.add(new Field("content", "hello黃河之水天上來吧我要更新內(nèi)容啦", type));writer.updateDocument(term, updateDoc);//提交更新內(nèi)容 釋放資源writer.commit();writer.close();testSearch();}//索引查詢過程@Testpublic void testSearch() throws Exception {//1.創(chuàng)建索引寫入器Directory d = FSDirectory.open(new File(indexPath));//打開索引目錄IndexReader r = DirectoryReader.open(d);IndexSearcher searcher = new IndexSearcher(r);QueryParser parser = new QueryParser("content", analyzer);Query query = parser.parse("hello");//查詢hello//search(查詢對象,符合條件的前n條記錄)TopDocs search = searcher.search(query, 10000);//n:前幾個結(jié)果System.out.println("符合條件的記錄有多少個:" + search.totalHits);ScoreDoc[] scoreDocs = search.scoreDocs;Document doc = null;for (int i = 0; i < scoreDocs.length; i++) {System.out.println("*******************************");System.out.println("分數(shù):" + scoreDocs[i].score);//相關(guān)度的排序int docId = scoreDocs[i].doc;//文檔編號Document document = searcher.doc(docId);System.out.println("文檔編號 docId--->" + docId);System.out.println("標題內(nèi)容 title:--->" + document.get("title"));System.out.println("正文內(nèi)容 content:--->" + document.get("content"));}} }

先創(chuàng)建一個創(chuàng)建索引的方法testCreateIndex()和索引查詢的方法testSearch()然后創(chuàng)建一個索引更新的方法testUpdate();
先執(zhí)行testCreateIndex()

在執(zhí)行testUpdate();

把文檔標題為doc2 的內(nèi)容更新為新的內(nèi)容,同時文檔編號發(fā)生變化,文檔編號為1的被刪除,增加類文檔編號3.說明更新的操作是先刪除后添加

刪除索引庫

@Testpublic void testDelete()throws Exception{//創(chuàng)建索引寫入器Directory d = FSDirectory.open(new File(indexPath));IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_4, analyzer);IndexWriter writer = new IndexWriter(d, config);//刪除記錄/*** 方式一Term term=new Term("title","doc2");writer.deleteDocuments(term);*///方式二QueryParser parser = new QueryParser("title", analyzer);Query query = parser.parse("doc3");writer.deleteDocuments(query);//將刪除操作提交writer.commit();writer.close();testSearch();}

Lucene進階

查詢所有

//索引查詢過程1 public void search1(String content) throws Exception {//1.創(chuàng)建索引寫入器Directory d = FSDirectory.open(new File(indexPath));//創(chuàng)建分詞器Analyzer analyzer = new StandardAnalyzer();//打開索引目錄IndexReader r = DirectoryReader.open(d);IndexSearcher searcher = new IndexSearcher(r);QueryParser parser = new QueryParser("content", analyzer);Query query = parser.parse(content);//查詢hello//search(查詢對象,符合條件的前n條記錄)TopDocs search = searcher.search(query, 10000);//n:前幾個結(jié)果System.out.println("符合條件的記錄有多少個:" + search.totalHits);ScoreDoc[] scoreDocs = search.scoreDocs;for (int i = 0; i < scoreDocs.length; i++) {System.out.println("*******************************");System.out.println("分數(shù):" + scoreDocs[i].score);//相關(guān)度的排序int docId = scoreDocs[i].doc;//文檔編號Document document = searcher.doc(docId);System.out.println("文檔編號 docId--->" + docId);System.out.println("標題內(nèi)容 title:--->" + document.get("title"));System.out.println("正文內(nèi)容 content:--->" + document.get("content"));}}//索引查詢過程2public void search2(Query query) throws Exception { //1.創(chuàng)建索引寫入器Directory d = FSDirectory.open(new File(indexPath)); //創(chuàng)建分詞器Analyzer analyzer = new StandardAnalyzer();//打開索引目錄IndexReader r = DirectoryReader.open(d);IndexSearcher searcher = new IndexSearcher(r);QueryParser parser = new QueryParser("content", analyzer);//search(查詢對象,符合條件的前n條記錄)TopDocs search = searcher.search(query, 10000);//n:前幾個結(jié)果System.out.println("符合條件的記錄有多少個:" + search.totalHits);ScoreDoc[] scoreDocs = search.scoreDocs;for (int i = 0; i < scoreDocs.length; i++) {System.out.println("*******************************");System.out.println("分數(shù):" + scoreDocs[i].score);//相關(guān)度的排序int docId = scoreDocs[i].doc;//文檔編號Document document = searcher.doc(docId);System.out.println("文檔編號 docId--->" + docId);System.out.println("標題內(nèi)容 title:--->" + document.get("title"));System.out.println("正文內(nèi)容 content:--->" + document.get("content"));}}@Test public void test1() throws Exception {search1("*:*");//查詢所有,匹配所有字段search2(new MatchAllDocsQuery());}

單詞搜索

/*** 單詞搜索** @throws Exception*/@Testpublic void test2() throws Exception {//search("title:doc1"); --->public void search(String content)search(new TermQuery(new Term("title", "doc1")));//--->search(Query query)}

段落查詢

/*** 段落查詢* @throws Exception*/@Testpublic void test3() throws Exception {// search("content:\"hello world\"");PhraseQuery query =new PhraseQuery();query.add(new Term("content","hello"));query.add(new Term("content","world"));search(query);}

通配符檢索

/*** 通配符檢索* @throws Exception*/ @Test public void test4() throws Exception { //查詢所有 //方式1search("l*ne"); //方式2search("luenc?"); //方式3WildcardQuery query = new WildcardQuery(new Term("content","l*ne"));search(query); }

search(“l(fā)**ne”);中的 *表示多個字符
search(“l(fā)uenc?”);中的?表示一個字符

單詞模糊查詢

Lucene支持單詞容錯content:lucenx ~1 表示支持單詞容錯一個字母,content:lucenx~N N最大值為2

@Test public void test5() throws Exception{ search("content:lxcenX~2"); FuzzyQuery query = new FuzzyQuery(new Term("content","lucenx"),1); search(query); }

相似查詢在關(guān)鍵字后面使用 ~ ( 波浪線)符號,后面可以跟一個表示相似度的數(shù)字,比如~0.85 , ~ 0.3 , ~1,值在0-1之間,1表示非常相似度最高,默認為0.5。

@Test public void test6() throws Exception{ search("lqcenX~1"); FuzzyQuery query = new FuzzyQuery(new Term("content","lqcenX")); search(query); }

段落查詢 (臨近查詢)

content:\”hello world\”~1 表示這個段落中間可以插入1個單詞
content:\”hello world\”~N 表示這個段落中間可以插入N個單詞

/*** 段落查詢 (臨近查詢)* @throws Exception*/@Testpublic void test7() throws Exception{//~1 表示這個段落中間可以插入一個單詞//content:\"hello world\"~N 表示這個段落中間可以插入N個單詞//search("content:\"hello world\"~1");PhraseQuery query = new PhraseQuery();query.add(new Term("content","hello"));query.add(new Term("content","world"));query.setSlop(1);//設(shè)置中間有一個停詞search(query);}

范圍檢索

/*** 范圍檢索*/ @Test public void test8() throws Exception { // {:左開區(qū)間 // }:右開區(qū)間 // [:左閉區(qū)間 // ]:右閉區(qū)間 //search("inputtime:{20101010 TO 20101012}"); //TermRangeQuery(查詢字段,左邊的值,右邊的值,是否左閉區(qū)間,是否右閉區(qū)間);TermRangeQuery query = new TermRangeQuery("inputtime", new BytesRef("20101010"), new BytesRef("20101012"), false, false);search(query); }

組合查詢

AND和&&:目標–>查詢出標題中包括One及內(nèi)容中包括java的文檔;
下面兩種情況均可:
title:one && content:java
title:one AND content:java

/*** 組合查詢AND和&&* @throws Exception*/@Testpublic void test9() throws Exception {//search("content:hello AND inputtime:{20101010 TO 20101012}");search("content:hello && inputtime:{20101010 TO 20101012}");/*BooleanQuery query = new BooleanQuery();query.add(new TermQuery(new Term("content","hello")), BooleanClause.Occur.MUST);query.add(new TermRangeQuery("inputtime",new BytesRef("20101010"),new BytesRef("20101012"),false,false), BooleanClause.Occur.MUST);search(query);*/}

OR和||:查詢出標題中包括One但內(nèi)容中不包括java的文檔;
默認情況下分詞組合即為邏輯或(OR)方式。
下面三種情況均可:
title:one || content:java
title:one OR content:java
title:one content:java

/*** 組合查詢OR和||* @throws Exception*/ @Test public void test10() throws Exception { //search("content:lucene OR inputtime:{20101010 TO 20101012}"); //search("content:lucene || inputtime:{20101010 TO 20101012}");BooleanQuery query = new BooleanQuery();query.add(new TermQuery(new Term("content","lucene")), BooleanClause.Occur.SHOULD);query.add(new TermRangeQuery("inputtime",new BytesRef("20101010"),new BytesRef("20101012"),false,false), BooleanClause.Occur.SHOULD);search(query); }

Not或!:查詢出標題中包括One但內(nèi)容中不包括java的文檔;
下面兩種情況均可:
title:one ! content:java
title:one NOT content:java

/*** 組合查詢OR和||* @throws Exception*/ @Test public void test10() throws Exception {//search("content:lucene OR inputtime:{20101010 TO 20101012}");//search("content:lucene || inputtime:{20101010 TO 20101012}");BooleanQuery query = new BooleanQuery();query.add(new TermQuery(new Term("content","lucene")), BooleanClause.Occur.SHOULD);query.add(new TermRangeQuery("inputtime",new BytesRef("20101010"),new BytesRef("20101012"),false,false), BooleanClause.Occur.SHOULD);search(query); }

必須包括(+)及排除(-):目標—>查詢出標題中包括One但內(nèi)容中不包括java的文檔;
+title:one -content:title

增加權(quán)重

Luence允許我們在組合查詢中,指定某一個詞的相關(guān)性權(quán)重值,從而可以讓得到相關(guān)性高的結(jié)果;
要提升一個詞的相關(guān)性權(quán)重,則可以在關(guān)鍵詞的后面添加^n來實現(xiàn)。
比如查詢jakarta apache,如果要把jakarta 的相關(guān)性提高,則可以改為jakarta^4 apache
相關(guān)性權(quán)重也可以用于詞組查詢,比如”jakarta apache”^4 “Apache Lucene” 將把與jakarta apache詞組最相關(guān)的優(yōu)先排列出來;
相關(guān)性權(quán)重值默認為1,一般要提升權(quán)重時均設(shè)置為大于1的整數(shù);該值也可以為0-1的小數(shù),但不能為負數(shù)。

/*** 增加權(quán)重* @throws Exception*/ @Test public void test12() throws Exception {//search("content:lucene^10 java");BooleanQuery query = new BooleanQuery();TermQuery termQuery = new TermQuery(new Term("content", "lucene"));termQuery.setBoost(10);//該查詢對象添加權(quán)重query.add(termQuery, BooleanClause.Occur.SHOULD);query.add(new TermQuery(new Term("content","java")), BooleanClause.Occur.SHOULD);search(query); }

特殊字符

由于| & ! + - ( ) 等符號在查詢表達式中被用做關(guān)鍵字,因此要查詢這些字符必須使用\來進行轉(zhuǎn)義處理。
當前Lucene查詢中的特殊字符:+ - && || ! ( ) { } [ ] ^ ” ~ * ? : \
比如,要查詢包括(1+1):2 的文檔,需要使用到如下表達式:
(1+1):2

分組
使用括號()對查詢表示式分組Grouping
Lucene查詢語法中支持通過()來對查詢表達式進行分組,從而組合出各種復雜的查詢。
1、查詢出標題中包括one或two,但內(nèi)容中不包括java的文檔;
Query query=parser.parse(“title:(one OR two) NOT content:java”);

高亮實現(xiàn)

1、高亮的概述:從搜索結(jié)果中截取一部分摘要,并把符合條件的記錄添加高亮顯示;
高亮需要使用jar包lucene-highlighter-4.10.4.jar
2、高亮涉及的功能包括兩部分:A、截取摘要,B、高亮顯示

Formatter formatter = new SimpleHTMLFormatter("<font color=\"red\">","</font>"); Scorer scorer = new QueryScorer(query); Highlighter hl = new Highlighter(formatter,scorer); hl.setMaxDocCharsToAnalyze(20); String str=hl.getBestFragment(new StandardAnalyzer(), "content",doc.get("content"));

原文出處:

CoderZS,?Lucene&全文檢索,?https://blog.csdn.net/zhang18024666607/article/details/78216635

轉(zhuǎn)載于:https://www.cnblogs.com/ryelqy/p/10104044.html

總結(jié)

以上是生活随笔為你收集整理的Lucene全文检索的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

亚洲精品国产精品99久久 | 在线观看网站av | 欧美一二三区在线播放 | 丰满少妇在线观看资源站 | 黄色av观看 | 免费在线精品视频 | 成人看片 | 在线看一区 | 在线观看黄色大片 | 欧美日韩国产一区二区在线观看 | 91香蕉视频在线下载 | 99re中文字幕 | 欧美一级电影免费观看 | 久久免费黄色大片 | 午夜a区 | 色综合久久88色综合天天6 | 三级在线国产 | 狠狠干网址 | 91爱爱免费观看 | 久久成人福利 | 久久玖| 99热精品久久 | 美女网站色免费 | 超碰在线中文字幕 | 天天色视频| 国产精品久久嫩一区二区免费 | 免费看日韩| 日韩有码网站 | 国产一区精品在线观看 | 国产精品成人免费精品自在线观看 | 成人福利在线观看 | 久久一区二 | 91精品国产高清自在线观看 | 一级黄色大片在线观看 | 美女国内精品自产拍在线播放 | 成年人国产在线观看 | 久久综合欧美 | av软件在线观看 | 超碰在线公开免费 | 天天鲁天天干天天射 | 日本公妇在线观看 | 黄色福利视频网站 | 在线看污网站 | 国产一线二线三线在线观看 | 美女网站黄免费 | 色综合天天 | 成人黄色小视频 | 亚洲国产网站 | 日韩大陆欧美高清视频区 | 四虎在线视频 | 成人小视频在线观看免费 | 五月婷婷六月综合 | 色欲综合视频天天天 | 久久久久激情视频 | 国产精品黄色av | 高清av在线免费观看 | 欧美 日韩 久久 | 国产精品久久久久久久久久 | 国产玖玖视频 | 久久久久久久久久久久av | 国产无遮挡又黄又爽馒头漫画 | 久久久久久久99精品免费观看 | 精品国产免费一区二区三区五区 | www.狠狠干| 久久国产剧场电影 | 92国产精品久久久久首页 | 国产精品一区二区果冻传媒 | 亚洲视频 一区 | 久久专区 | 精品一区二区日韩 | 免费日韩| 精品亚洲二区 | 精品国产自在精品国产精野外直播 | 韩国av电影网 | 丝袜精品视频 | 免费手机黄色网址 | 国产精品免费小视频 | 欧美不卡在线 | 9999在线视频 | 91麻豆传媒 | 亚洲欧洲精品在线 | 亚洲日本va午夜在线电影 | 美女网站黄免费 | 极品久久久久久久 | 麻豆视频免费入口 | 色婷婷在线播放 | 9992tv成人免费看片 | 五月婷在线播放 | 日韩中文字幕在线不卡 | www.久草视频| 在线看av的网址 | 在线观看你懂的网址 | wwwav视频 | 国产精品激情偷乱一区二区∴ | 不卡的av电影 | 国产日韩精品一区二区在线观看播放 | 日韩精品视频免费专区在线播放 | 国产亚洲在线视频 | a级片久久 | 精品久久久久久久久亚洲 | 精品国产一二三四区 | av在线影片| 国产精品久久久久亚洲影视 | 狠狠干婷婷色 | 午夜av一区二区三区 | 久久久久久久影视 | 午夜精品一区二区三区在线播放 | 久久男人视频 | 国产日韩欧美在线观看 | 欧美成人h版电影 | www.夜夜爱 | 狠狠色狠狠色 | 欧美成人一区二区 | 91精品久久久久 | 欧美91精品久久久久国产性生爱 | 91一区二区三区在线观看 | 久久九九影视网 | 亚洲精品国偷自产在线99热 | 青青五月天| 99精品在线 | 国产精品igao视频网入口 | 91自拍视频在线 | 五月婷婷中文字幕 | 天天射天天干天天爽 | 久久久精品亚洲 | 日韩在线视频一区 | 日韩在线三级 | 国产电影黄色av | 草久久av| 日韩欧美精品在线视频 | 00av视频 | 精品美女久久久久久免费 | 成人午夜剧场在线观看 | 欧美午夜寂寞影院 | 国产精品久久久久久久免费观看 | 丰满少妇在线观看资源站 | 久久香蕉电影 | 国产在线欧美在线 | 国产精品黄色影片导航在线观看 | 久久黄色小说视频 | 中文字幕你懂的 | 色婷婷综合久久久 | 久久久高清一区二区三区 | 国产精品九九九 | 激情久久伊人 | 成人一级电影在线观看 | 在线网站黄 | 亚洲蜜桃av | 成人在线免费观看视视频 | 中文字幕专区高清在线观看 | 日精品在线观看 | 亚洲午夜久久久久久久久久久 | 免费国产在线精品 | 国产69精品久久久久久 | 中文字幕视频观看 | 欧美色图东方 | 色视频成人在线观看免 | 国产视频一区精品 | 日韩中文字幕免费视频 | 亚洲国产mv| 国产亚洲欧美一区 | 在线看的av网站 | 亚洲 欧美日韩 国产 中文 | 国产精品高潮呻吟久久av无 | www.久久免费| 婷婷日日| 在线只有精品 | 色91在线视频 | 日韩成人看片 | 天天天天天天操 | www.久久久精品 | 福利片视频区 | av在线等 | 人人爱人人爽 | 亚洲黄色免费观看 | 三日本三级少妇三级99 | 中文字幕制服丝袜av久久 | 国产视频手机在线 | 久久久久久高潮国产精品视 | 国产精品一区二区久久精品爱微奶 | 天天干天天想 | 国产精品热视频 | 国产精品视频永久免费播放 | 国产拍在线 | 制服丝袜一区二区 | 久在线| 97av视频| 五月天婷婷综合 | 国产精品短视频 | av在线专区| 天天操天操 | 91精品国产三级a在线观看 | 99这里只有精品视频 | 午夜精品久久久久久久99 | 午夜精品一二三区 | 天天av在线播放 | 日韩午夜高清 | 在线观看国产中文字幕 | 国产麻豆精品一区 | 三级a毛片| 久久国产露脸精品国产 | 98精品国产自产在线观看 | 99久久精品国产一区二区三区 | 国产精品高清免费在线观看 | 精品自拍sae8—视频 | 亚洲乱码国产乱码精品天美传媒 | 亚洲日本国产精品 | 日韩精品一区二区三区电影 | 99视频免费播放 | 精品国产一区二区三区久久久 | 久久精品欧美一区二区三区麻豆 | 美女视频黄的免费的 | 久久高清视频免费 | 97夜夜澡人人爽人人免费 | 在线观看视频亚洲 | 最近更新好看的中文字幕 | 久久综合影音 | 国产精品一区二区在线 | 中日韩欧美精彩视频 | 国产视频中文字幕在线观看 | 久草在线视频免费资源观看 | 欧美午夜理伦三级在线观看 | 色五月激情五月 | 国产午夜剧场 | 日产乱码一二三区别在线 | 国产不卡在线播放 | 日本在线视频一区二区三区 | 在线免费观看黄色av | 亚洲天天做| 97视频精品| 国产亚洲精品久久久久久移动网络 | 亚洲精品麻豆视频 | 欧美日韩另类在线观看 | 99精品国产在热久久 | 欧美另类69 | 97在线视频观看 | 成人午夜电影网站 | 久久久久国产精品www | 久久久久久毛片精品免费不卡 | 日本精品一区二区 | 国产精品久久久久久一区二区 | 日韩丝袜 | 四虎影视成人精品 | 午夜精品成人一区二区三区 | 亚洲精品视频观看 | 91电影福利 | 久久久久久网址 | 色吧久久| 又黄又爽又刺激视频 | 中文字幕在线一区观看 | 国产在线v | 国产欧美精品一区二区三区四区 | 久草免费福利在线观看 | 国产午夜精品一区 | 色中文字幕在线观看 | 亚洲性视频 | 亚洲精品永久免费视频 | 亚洲a成人v | 丁香花在线观看视频在线 | 欧美国产日韩在线视频 | 久久精品99国产精品亚洲最刺激 | aaa亚洲精品一二三区 | 一级久久精品 | 国产高清在线 | 韩国精品视频在线观看 | 国产91亚洲 | 国产精品毛片完整版 | 久久艹艹| 成人小视频免费在线观看 | 国产99久久九九精品免费 | 五月激情丁香婷婷 | 亚洲精品久久久久久久蜜桃 | 99视频在线观看视频 | 探花视频在线版播放免费观看 | 亚洲午夜在线视频 | 久久久久久久久爱 | 久久成人亚洲欧美电影 | 久久婷婷激情 | 亚洲精品成人 | 亚洲成人免费在线观看 | 亚洲精品综合一二三区在线观看 | 大胆欧美gogo免费视频一二区 | 色网站在线 | 亚洲国产人午在线一二区 | 99久久久国产精品美女 | www狠狠 | 麻豆视频www | av成人动漫在线观看 | 在线观看91av | 激情欧美在线观看 | 国产一级二级在线观看 | 久久综合中文字幕 | 99视频精品视频高清免费 | 国产精品刺激对白麻豆99 | 国产护士av | 国产专区欧美专区 | 久久视频一区二区 | 欧美专区日韩专区 | 人人干人人做 | 成人综合婷婷国产精品久久免费 | 久久99精品久久久久久秒播蜜臀 | 在线观看免费高清视频大全追剧 | 成人全视频免费观看在线看 | 国产91精品看黄网站在线观看动漫 | 亚洲婷婷在线 | 午夜美女网站 | 349k.cc看片app| 国产成人久久av | 国产又粗又猛又色又黄视频 | 日韩sese | 丰满少妇在线观看网站 | 日韩国产欧美在线播放 | 久久激五月天综合精品 | 97视频在线观看成人 | 麻豆精品在线视频 | 一区二区三区在线免费播放 | www看片网站 | 免费黄色网止 | 亚洲国产影院 | 日韩视频中文字幕在线观看 | 不卡的av| 国产精品少妇 | 久久天天躁狠狠躁亚洲综合公司 | 九九热免费在线观看 | 欧美 日韩 性 | 日韩在线观看影院 | 亚洲在线成人精品 | 中文字幕在线观看2018 | 国产亚洲精品久久久久久无几年桃 | 国产色在线观看 | 久久热首页 | 中文字幕日韩无 | 久久久久国 | 久久久精华网 | 97在线影院 | 精品夜夜嗨av一区二区三区 | 最近日本中文字幕a | 久久香蕉国产精品麻豆粉嫩av | 日本精品一区二区三区在线观看 | 五月综合激情婷婷 | 精品999| 免费成人av| 亚洲 综合 专区 | 精品少妇一区二区三区在线 | 成人黄色小说在线观看 | 国内精品久久久久影院一蜜桃 | 亚洲欧美视频在线播放 | 午夜视频黄 | www天天操| 在线亚洲欧美日韩 | 五月婷婷香蕉 | 久久黄色影视 | 午夜精品视频一区二区三区在线看 | 国产综合福利在线 | 日韩欧美国产激情在线播放 | 国产福利一区二区三区视频 | 在线观看韩国av | 在线观看片 | 国产精品久久久久久久久婷婷 | 99视频在线看 | 四虎天堂 | 狠狠的操| 国产精品成人在线 | 91在线视频观看 | 久久精品免费观看 | 亚洲色图激情文学 | 狠狠干夜夜 | 国产97视频 | 国产成人精品一区二区三区福利 | 天天色影院| 夜夜操网 | 91亚洲在线 | 欧美成a人片在线观看久 | 欧美色精品天天在线观看视频 | 亚洲一二三区精品 | www.夜夜草| 在线国产视频一区 | 狠狠地操 | 日本韩国在线不卡 | 日本在线观看中文字幕无线观看 | 特黄特色特刺激视频免费播放 | 日韩欧美一区二区三区视频 | 一级黄色片在线观看 | 日韩电影在线一区 | 狠狠的日日 | 久草视频视频在线播放 | 国产亚洲综合精品 | 天天摸天天干天天操天天射 | 精品国产乱码久久 | 18女毛片 | 免费看91的网站 | 狠狠色综合欧美激情 | 91三级在线观看 | 日本中文字幕网站 | 欧美日韩国产综合一区二区 | 国产在线精品区 | 亚洲第一区精品 | www.com久久久 | 久草国产在线观看 | 日韩精品一卡 | 2019中文在线观看 | 狠狠狠色丁香婷婷综合久久88 | 欧美精品一区二区免费 | 亚洲日本va午夜在线电影 | 蜜桃视频在线视频 | 这里只有精品视频在线 | 天天综合操 | 日韩亚洲在线视频 | 成人黄色大片网站 | 精品国产欧美一区二区三区不卡 | 亚洲国产精品久久久 | 在线观看视频在线观看 | 免费久久久久久久 | 久久久免费| 成人亚洲精品国产www | 韩国中文三级 | 婷婷色网 | 亚洲综合在线观看视频 | 97超碰人人爱 | 日韩理论视频 | 日韩精品视频第一页 | 国产无限资源在线观看 | 你操综合 | 中文字幕美女免费在线 | 亚洲成人av在线播放 | 色综合久久88色综合天天人守婷 | 在线影院中文字幕 | 国产一区二区久久久久 | 免费高清男女打扑克视频 | 国产一区二区三区高清播放 | 国产品久精国精产拍 | 国产aaa大片 | 精品欧美一区二区精品久久 | 99久久日韩精品视频免费在线观看 | 黄色av电影| 麻豆免费视频 | 久久av伊人 | 国产高清日韩 | 日韩字幕在线观看 | www国产亚洲精品久久网站 | 欧美一二三视频 | 国产精品毛片一区二区 | 国产精品露脸在线 | 九九九在线 | 碰超在线观看 | 99精品电影 | 色悠悠久久综合 | 91丨九色丨蝌蚪丨老版 | 在线观看av不卡 | www.激情五月.com | 三级a毛片 | 国产成人精品午夜在线播放 | 色亚洲激情 | 天天色宗合 | 国产精品系列在线 | 中文字幕av一区二区三区四区 | 狠狠狠狠狠狠狠狠 | 丁香婷婷久久久综合精品国产 | 91视频免费网站 | 国产91免费观看 | 欧美a级在线播放 | 久久99亚洲精品久久 | 狠狠躁夜夜躁人人爽超碰91 | 丁香婷婷激情国产高清秒播 | 国产成人精品电影久久久 | 久热色超碰 | 欧美大片mv免费 | 亚洲精品国偷自产在线99热 | 亚洲精品一区二区精华 | 免费在线观看日韩视频 | 久久爱www. | 国产高清av免费在线观看 | 一区二区三区在线观看免费 | 播五月综合 | 狠狠的操你| 成人国产网址 | 中文字幕亚洲精品在线观看 | 日韩精品一区二区三区三炮视频 | 亚洲精品在线免费播放 | 国产高清av在线播放 | 亚洲精选国产 | 国产亚洲午夜高清国产拍精品 | 欧美日韩亚洲在线观看 | 婷婷精品国产欧美精品亚洲人人爽 | 视频一区二区在线 | 日韩在线激情 | av免费看网站 | 国产视频亚洲视频 | 中文在线8新资源库 | 色狠狠综合天天综合综合 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 免费黄色在线播放 | 最近更新好看的中文字幕 | 国产成人精品福利 | 久久99久久99精品免观看软件 | 亚洲精品在线观看中文字幕 | 国产精品美女久久久久久久久 | 九九色综合 | 日本中文字幕观看 | 国产免费一区二区三区网站免费 | 探花视频免费在线观看 | 麻豆视频国产在线观看 | 中文字幕免费在线 | 精品久久久久一区二区国产 | 精品视频在线免费 | 黄色软件在线观看视频 | 在线观看亚洲国产精品 | 在线你懂 | 国产五月婷婷 | 午夜精品久久一牛影视 | 日韩视频图片 | 91成人天堂久久成人 | 亚洲欧洲精品一区 | 日本久久久久久久久久 | 91最新在线 | av激情五月 | 日韩精品视频一二三 | 人人澡人人爽欧一区 | 国产精品一区一区三区 | 麻豆久久一区二区 | 在线观看国产亚洲 | 天天射天天干天天爽 | 国产精品免费久久久久 | 欧美激情精品久久久 | 国产69精品久久久久久久久久 | 亚洲精品大片www | 99国产高清| av黄色影院| 亚洲欧美在线观看视频 | 国产一区在线免费观看视频 | 亚洲综合一区二区精品导航 | 久久99精品久久久久久久久久久久 | 99久久er热在这里只有精品15 | 在线免费观看视频 | 992tv人人网tv亚洲精品 | 亚洲国产片色 | 在线电影91 | 免费a v网站 | 亚洲.www | 手机成人在线 | 在线激情电影 | 国产成a人亚洲精v品在线观看 | 91色视频 | 热99久久精品 | 国产黄色精品在线 | 最近中文国产在线视频 | 成人午夜剧场在线观看 | 999国产在线 | 韩国一区视频 | 久草视频在线新免费 | 99久久激情 | 亚洲高清国产视频 | ,午夜性刺激免费看视频 | 婷婷丁香av | 成人性生交大片免费观看网站 | 国产高清第一页 | 91大神视频网站 | 国产成人在线观看免费 | av在线播放网址 | 国产成人一级电影 | 欧美精品中文字幕亚洲专区 | 日韩在线大片 | 成人黄色在线视频 | 久久躁日日躁aaaaxxxx | 97涩涩视频 | 黄色三级网站 | 亚洲精品视频在线观看网站 | 99精品国自产在线 | 成人av片免费观看app下载 | 美女久久久久久久久久久 | 在线成人短视频 | 中文字幕第一页在线播放 | 99热精品在线观看 | 美女久久一区 | 91麻豆精品国产91久久久久 | 欧美性精品 | 中文字幕在线观看一区二区三区 | japanesefreesexvideo高潮 | 欧美亚洲xxx| 国产精品高清免费在线观看 | 97超碰在线资源 | 五月婷婷婷婷婷 | 欧美精品小视频 | 人人干人人艹 | 亚洲91中文字幕无线码三区 | 久久99免费观看 | 在线观看免费av网站 | 最新中文字幕视频 | 中文字幕av在线不卡 | 国产精品成人一区二区 | 色在线视频 | 99色免费视频| 天天色影院 | 亚洲精品国产精品国自产观看 | 国产精品免费大片视频 | 国产视频在线免费 | 国产 一区二区三区 在线 | 国产精品视频区 | 在线观看黄色免费视频 | 久久99精品久久久久久三级 | 欧美最猛性xxxx | 久久有精品 | 久久久福利影院 | 亚洲中字幕 | 久久久久福利视频 | 麻豆传媒视频在线 | 久色伊人| www日韩精品 | av中文字幕av | 99久久综合狠狠综合久久 | www色网站 | 国产精品久久久久久久久久免费看 | 天天天天综合 | 黄色免费av | 成人久久综合 | 在线 你懂 | 久久歪歪 | 亚洲国产精品va在线看黑人动漫 | av在线免费不卡 | 日日夜夜91 | 久久免费在线观看视频 | 91免费视频网站在线观看 | 国内小视频在线观看 | 亚洲综合视频在线观看 | 欧美激情在线网站 | 欧美精品三级在线观看 | 成人黄色小说网 | 久久精品79国产精品 | 9999精品视频| 国产精品毛片一区 | 国模视频一区二区 | 正在播放五月婷婷狠狠干 | 天天爱天天射天天干天天 | 精品在线小视频 | 亚洲精品综合一区二区 | 伊人伊成久久人综合网小说 | 亚洲精品一区二区在线观看 | www日| av在线电影播放 | 国产精品不卡视频 | 99精品热视频| 六月丁香激情综合色啪小说 | 欧美一级免费片 | 91大神一区二区三区 | 国产精品久久久久婷婷二区次 | 99色免费 | 亚洲成人免费 | 国产超碰在线 | 成人网色 | 91麻豆精品国产91久久久久 | www.五月激情.com | 日韩在线观看三区 | 99草视频在线观看 | 91精品一区国产高清在线gif | 日韩激情小视频 | 亚洲天堂免费视频 | 欧美性直播 | 男女免费视频观看 | 亚洲精品一区二区三区四区高清 | 正在播放 久久 | 在线成人免费 | 超碰在线观看97 | 激情丁香综合五月 | 中文字幕在线专区 | 中文字幕在线视频一区 | 国产69精品久久久久久久久久 | 国产精品免费人成网站 | 成年人在线免费视频观看 | 欧美日韩三级在线观看 | 色午夜| 日韩欧美一区二区在线播放 | av免费电影网站 | 成人夜晚看av| 91麻豆精品国产91久久久久久 | av最新资源 | 在线97| 亚洲综合视频在线 | 国产成人精品一区二区在线 | 国产系列 在线观看 | 亚洲一区黄色 | 色操插 | 四虎成人在线 | 成年人免费观看在线视频 | 久久激情视频 久久 | 日韩av免费在线看 | 在线观看免费高清视频大全追剧 | 色婷婷九月 | 免费看日韩 | 亚洲成人精品国产 | 国产又粗又长又硬免费视频 | 国产日韩精品一区二区三区在线 | 伊人影院在线观看 | 99在线免费视频观看 | 丁香花中文字幕 | 欧美日韩1区2区 | 青草视频在线 | 有码中文字幕在线观看 | 久久超碰免费 | 日韩91在线 | 干亚洲少妇 | 国产一区二区三区 在线 | 国产123区在线观看 国产精品麻豆91 | 97人人看 | 日本精品视频免费观看 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 国产精品日韩久久久久 | 香蕉视频网址 | 国产精品午夜在线观看 | 五月天九九 | 99re8这里有精品热视频免费 | 激情五月伊人 | 91精品国自产在线偷拍蜜桃 | 天天综合中文 | 精品国产伦一区二区三区 | 午夜精品久久久久久久99热影院 | 亚洲精品xx | 日本在线精品视频 | 一区二区三区国产精品 | 午夜999 | 亚洲www天堂com | 欧美精品一二 | 久久久久久久影院 | 五月天狠狠操 | 亚州精品一二三区 | 国产精品久久久久久麻豆一区 | 福利一区二区三区四区 | 一区 在线观看 | 久久精品欧美日韩精品 | 在线观看中文字幕一区二区 | 日韩黄色网络 | www91在线观看| 91最新视频 | 波多野结衣电影一区二区三区 | 色欧美成人精品a∨在线观看 | 国产青草视频在线观看 | 欧美一区二区在线刺激视频 | 97免费在线观看视频 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 91高清一区 | 五月天综合网站 | 中文字幕第一页在线 | 久久成人毛片 | 超碰.com| 日韩精品免费专区 | 久久国产精品99国产 | 亚洲国产欧美在线人成大黄瓜 | 精品国产伦一区二区三区观看体验 | 国产一区二区免费 | 中文字幕激情 | 国内久久精品 | www.黄色片网站 | 成人黄色av网站 | 怡红院久久 | 日韩mv欧美mv国产精品 | 天天色天天骑天天射 | 国产免费三级在线观看 | 国产免费三级在线观看 | 911香蕉视频 | 日韩理论片在线 | 狠狠色丁香婷婷综合视频 | 91精品啪啪 | 国产精品久久久久久久久久久久午夜 | 精品亚洲va在线va天堂资源站 | 日韩av资源在线观看 | 国产一级片免费视频 | 久久久久国产一区二区 | 久久这里只有精品视频99 | 97超碰国产精品 | 18性欧美xxxⅹ性满足 | 亚洲精品无 | 97香蕉超级碰碰久久免费软件 | 日本不卡一区二区三区在线观看 | 免费在线电影网址大全 | 2020天天干夜夜爽 | 亚洲精品成人av在线 | 毛片永久免费 | 精品国产一区二区三区久久影院 | 亚洲国产高清视频 | 欧美激情操 | 久久综合久久综合久久综合 | 亚洲日本va午夜在线电影 | а天堂中文最新一区二区三区 | 国产精品欧美久久久久久 | 国产中文字幕视频在线 | 免费在线观看日韩欧美 | japanesefreesex中国少妇 | 欧美韩国日本在线 | 男女日麻批 | 精品国产乱码一区二区三区在线 | 久久国产经典视频 | 鲁一鲁影院 | 91超碰免费在线 | 国产一级片免费播放 | 久久综合之合合综合久久 | 欧美精品中文字幕亚洲专区 | 亚洲国产视频网站 | 亚洲免费av电影 | 粉嫩高清一区二区三区 | 国产欧美综合在线观看 | 国产又粗又猛又黄又爽的视频 | 久久久久久久久久久精 | 99热官网| 久久综合福利 | 久久成年人| 欧美激情视频在线免费观看 | 天天操天天添天天吹 | 久久av黄色| 欧美日韩在线免费观看 | 国产美腿白丝袜足在线av | 日韩中文在线视频 | 欧美在线你懂的 | 中国黄色一级大片 | 91大神电影 | 女人18片毛片90分钟 | 日韩免费在线观看网站 | 免费看黄网站在线 | 婷婷久久一区二区三区 | 精品国产一区二区三区日日嗨 | 日日夜夜综合 | 丁香九月婷婷综合 | 久久久久久国产精品 | 操操操干干干 | 国产精品久久久久久久免费大片 | 高清视频一区二区三区 | 成人h在线观看 | 91视频免费看 | 黄色一级在线免费观看 | 国产成人a亚洲精品v | 色一级片 | 免费在线观看成人 | 97视频在线播放 | 久久免费视频在线观看 | a级国产乱理伦片在线观看 亚洲3级 | 黄色成人av在线 | 美女久久久久 | 久久精品直播 | 99视频国产精品免费观看 | 偷拍精品一区二区三区 | 麻豆精品在线 | 午夜丰满寂寞少妇精品 | 丝袜制服天堂 | 国产精品 国产精品 | 91精品视频一区二区三区 | 免费视频久久久久久久 | 国产亚洲欧洲 | 国产精品黑丝在线观看 | 欧美激情视频三区 | 天天操天天射天天插 | 69视频永久免费观看 | 久久精品国产免费看久久精品 | 国产婷婷vvvv激情久 | 一区二区三区在线看 | 国产亚洲精品日韩在线tv黄 | 久久久久久久免费看 | 热久久影视 | 欧美日韩国产精品久久 | 国产婷婷精品 | 98超碰在线观看 | 国产亚洲一区二区三区 | 五月激情片 | 久久99国产精品免费网站 | 欧美日韩在线视频观看 | 久久国产露脸精品国产 | 黄色精品久久久 | 91丨九色丨蝌蚪丰满 | 深夜免费小视频 | 国产区欧美 | 天天综合网久久综合网 | 国产一区二区精品 | 中文字幕第一页在线视频 | 成人资源在线播放 | 亚洲最大免费成人网 | 一二区av | av一级在线| 国产成人一二片 | 高潮毛片无遮挡高清免费 | 国产专区第一页 | 久久综合免费视频影院 | 国产亚洲综合性久久久影院 | 日韩欧美一区二区在线播放 | 草免费视频 | 久久久久免费精品国产小说色大师 | 国产1区在线 | 激情综合色综合久久 | 久国产在线播放 | 国内精品小视频 | 西西44人体做爰大胆视频 | 久久午夜影院 | 在线观看aa| 碰超人人 | 人人网人人爽 | 成人网看片 | 日韩三级中文字幕 | 992tv在线成人免费观看 | 久久精品视频18 | 日韩在线视频二区 | 国产九九在线 | 狠狠狠色| 久久精品波多野结衣 | 69国产盗摄一区二区三区五区 | 久久久久久久久影视 | 色婷婷综合久久久久中文字幕1 | 91日韩在线专区 | 一区二区三区日韩视频在线观看 | 久久久.com| 天堂麻豆 | 天天天在线综合网 | 在线91精品 | 婷婷精品国产一区二区三区日韩 | 国产日韩高清在线 | 成年人在线看片 | 91丨精品丨蝌蚪丨白丝jk | 国产精品 久久 | 三级午夜片 | 波多野结衣一区二区三区中文字幕 | 国产日韩欧美在线一区 | 97在线观看视频免费 | 男女日麻批| 久久国产精品偷 | 国产精品女| 日本mv大片欧洲mv大片 | 欧美一级免费 | 色在线观看网站 | 正在播放日韩 | 久久久久久免费视频 | 五月天亚洲精品 | 中文字幕久久久精品 | 黄色在线观看网站 | 免费看污片 | 视频一区在线免费观看 | 日韩中文免费视频 | 激情久久久久 | 久久久久久久久久久久av | 国产精品观看在线亚洲人成网 | av福利在线免费观看 | 国产色婷婷 | 色婷婷亚洲综合 | 久久综合色影院 | 中文字幕在线观看视频网站 | 欧美激情视频一二三区 | 日韩av二区| 中文字幕视频三区 | 伊人春色电影网 | 久久视精品 | 韩日精品在线观看 | 久久视频国产精品免费视频在线 | 欧美日韩在线视频观看 | 国产91成人 | 成人av中文字幕 | 国产黑丝一区二区三区 | 91免费高清视频 | 国产黄色一级片 | 亚洲精欧美一区二区精品 | 999热视频| 久久99精品久久只有精品 | 91大神精品视频 | 亚洲撸撸 | 最近中文字幕视频完整版 | 久久公开免费视频 | www99久久| 美女久久网站 | av不卡网站 | 国产99色 | 国产原厂视频在线观看 | 波多野结衣视频网址 | 精品国产一区二区三区噜噜噜 | 日韩美女av在线 | 天天射天天射 | 麻豆视频大全 | 欧美一区免费观看 | 制服丝袜在线 | 日日爽天天操 | 国产不卡精品视频 | 黄色网址中文字幕 | 特级xxxxx欧美 | 狠狠狠干狠狠 | 国产精品女人久久久久久 | 草久热 | 成人在线一区二区三区 | 欧美日韩中文国产一区发布 | 精品一区二区在线播放 | 五月天丁香亚洲 | 国产专区视频在线观看 | 欧美性生爱 | 久久综合偷偷噜噜噜色 | 美女黄网站视频免费 | 在线精品视频免费播放 | 日韩av有码在线 | 日产乱码一二三区别免费 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 又黄又刺激的视频 | 在线观看的av网站 | 激情在线网址 | 色婷婷88av视频一二三区 | 久久精品这里精品 | 99久e精品热线免费 99国产精品久久久久久久久久 | 高潮久久久久久 | 久久综合加勒比 |