将Lucene搜索集成到应用程序中
本文是我們名為“ Apache Lucene基礎(chǔ)知識(shí) ”的學(xué)院課程的一部分。
在本課程中,您將了解Lucene。 您將了解為什么這樣的庫(kù)很重要,然后了解Lucene中搜索的工作方式。 此外,您將學(xué)習(xí)如何將Lucene Search集成到您自己的應(yīng)用程序中,以提供強(qiáng)大的搜索功能。 在這里查看 !
目錄
1.簡(jiǎn)介 2.解析查詢字符串1.簡(jiǎn)介
Java Lucene提供了一種功能非常強(qiáng)大的查詢語(yǔ)言,用于對(duì)大量數(shù)據(jù)執(zhí)行搜索操作。
查詢分為術(shù)語(yǔ)和運(yùn)算符。 術(shù)語(yǔ)共有三種: 單項(xiàng) , 短語(yǔ)和子查詢 。 單個(gè)術(shù)語(yǔ)是一個(gè)單詞,例如“ test”或“ hello”。 短語(yǔ)是一組用雙引號(hào)括起來(lái)的單詞,例如“ hello dolly”。 子查詢是用括號(hào)括起來(lái)的查詢,例如“(hello dolly)”。
Lucene支持?jǐn)?shù)據(jù)字段。 執(zhí)行搜索時(shí),您可以指定一個(gè)字段,也可以使用默認(rèn)字段。 字段名稱取決于索引數(shù)據(jù),默認(rèn)字段由當(dāng)前設(shè)置定義。
2.解析查詢字符串
查詢解析器的工作是將用戶提交的查詢字符串轉(zhuǎn)換為查詢對(duì)象。
查詢由解析器解析其內(nèi)容。 這是一個(gè)例子:
{"query_string" : {"default_field" : "content","query" : "this AND that OR thus"} }query_string頂級(jí)參數(shù)包括:
| 參數(shù) | 描述 |
| query | 要解析的實(shí)際查詢。 |
| default_field | 如果未指定前綴字段,則為查詢?cè)~的默認(rèn)字段。 默認(rèn)為index.query.default_field索引設(shè)置,而索引設(shè)置又默認(rèn)為_all。 |
| default_operator | 如果未指定顯式運(yùn)算符,則使用默認(rèn)運(yùn)算符。 例如,使用OR的默認(rèn)運(yùn)算符,匈牙利的查詢大寫被轉(zhuǎn)換為OR匈牙利的大寫OR,使用AND的默認(rèn)運(yùn)算符,相同的查詢被轉(zhuǎn)換為AND匈牙利的大寫AND。 默認(rèn)值為“或”。 |
| analyzer | 用于分析查詢字符串的分析器名稱。 |
| allow_leading_wildcard | 設(shè)置時(shí),*或? 允許作為第一個(gè)字符。 默認(rèn)為true。 |
| lowercase_expanded_terms | 通配符,前綴,模糊和范圍查詢的術(shù)語(yǔ)是否要自動(dòng)小寫(因?yàn)槲磳?duì)其進(jìn)行分析)。 默認(rèn)為true。 |
| enable_position_increments | 設(shè)置為true以在結(jié)果查詢中啟用位置增量。 默認(rèn)為true。 |
| fuzzy_max_expansions | 控制模糊查詢將擴(kuò)展到的術(shù)語(yǔ)數(shù)量。 默認(rèn)為50 |
| fuzziness | 設(shè)置模糊查詢的模糊性。 默認(rèn)為自動(dòng)。 |
| fuzzy_prefix_length | 設(shè)置模糊查詢的前綴長(zhǎng)度。 默認(rèn)值為0。 |
| phrase_slop | 設(shè)置短語(yǔ)的默認(rèn)斜率。 如果為零,則需要精確的短語(yǔ)匹配。 預(yù)設(shè)值為0。 |
| boost | 設(shè)置查詢的提升值。 默認(rèn)為1.0。 |
| analyze_wildcard | 默認(rèn)情況下,不分析查詢字符串中的通配符術(shù)語(yǔ)。 通過(guò)將此值設(shè)置為true,也將盡最大努力對(duì)這些值進(jìn)行分析。 |
| auto_generate_phrase_queries | 默認(rèn)為false。 |
| minimum_should_match | 一個(gè)值,該值控制在結(jié)果布爾查詢中應(yīng)匹配多少個(gè)“應(yīng)該”子句。 它可以是絕對(duì)值(2),百分比(30%)或兩者的組合。 |
| lenient | 如果設(shè)置為true,將導(dǎo)致忽略基于格式的錯(cuò)誤(例如,向數(shù)字字段提供文本)。 |
| locale | [1.1.0]在1.1.0.Locale中添加,應(yīng)用于字符串轉(zhuǎn)換。 默認(rèn)為ROOT。 |
表格1
生成多詞查詢時(shí),可以使用rewrite參數(shù)控制如何重寫它。
QueryParser的規(guī)則
假設(shè)您正在Web上搜索同時(shí)包含單詞java和net但不包含單詞dot的頁(yè)面。 如果搜索引擎讓您為此簡(jiǎn)單查詢輸入類似以下內(nèi)容,該怎么辦?
BooleanQuery query = new BooleanQuery(); query.add(new TermQuery(new Term("contents","java")), true, false); query.add(new TermQuery(new Term("contents", "net")), true, false); query.add(new TermQuery(new Term("contents", "dot")), false, true);那將是真正的阻力。 幸運(yùn)的是,Google,Nutch和其他搜索引擎比這更友好,允許您輸入更簡(jiǎn)潔的內(nèi)容: java AND net NOT dot 。首先,我們將了解在應(yīng)用程序中使用QueryParser涉及的內(nèi)容。
使用QueryParser
使用QueryParser非常簡(jiǎn)單。 需要三件事:表達(dá)式,用于表達(dá)式中非限定字段的默認(rèn)字段名稱以及用于分析表達(dá)式片段的分析器。字段選擇限定符在查詢語(yǔ)法部分中討論。 “分析癱瘓”部分介紹了特定于查詢解析的分析。 現(xiàn)在,讓我們分析一個(gè)表達(dá)式:
String humanQuery = getHumanQuery(); Query query = QueryParser.parse(humanQuery, "contents", new StandardAnalyzer());一旦獲得Query對(duì)象,就可以像直接通過(guò)API創(chuàng)建查詢一樣進(jìn)行搜索。 這是使用用戶輸入的查詢字符串搜索現(xiàn)有索引并將結(jié)果顯示到控制臺(tái)的完整方法:
public static void search(File indexDir, String q) throws Exception{ Directory fsDir = FSDirectory.getDirectory(indexDir, false);IndexSearcher is = new IndexSearcher(fsDir);Query query = QueryParser.parse(q, "contents", new StandardAnalyzer());Hits hits = is.search(query);System.out.println("Found " + hits.length() +" document(s) that matched query '" + q + "':");for (int i = 0; i < hits.length(); i++) {Document doc = hits.doc(i);System.out.println(doc.get("filename"));} }根據(jù)簡(jiǎn)單的語(yǔ)法分析傳遞給QueryParser表達(dá)式。 遇到非法表達(dá)式時(shí), QueryParser引發(fā)ParseException 。
QueryParser表達(dá)式語(yǔ)法
本節(jié)中的以下各項(xiàng)描述QueryParser支持創(chuàng)建各種查詢類型的語(yǔ)法。
單項(xiàng)查詢
僅一個(gè)單詞的查詢字符串將轉(zhuǎn)換為基礎(chǔ)TermQuery 。
詞組查詢
要在一個(gè)字段中一起搜索一組單詞,請(qǐng)用雙引號(hào)將單詞引起來(lái)。 查詢“ hello world”對(duì)應(yīng)于精確的詞組匹配,要求“ hello”和“ world”是匹配的連續(xù)項(xiàng)。 Lucene還支持草率的短語(yǔ)查詢,其中引號(hào)之間的術(shù)語(yǔ)不必嚴(yán)格按順序排列。 斜率因子衡量將術(shù)語(yǔ)重新排列為準(zhǔn)確順序需要執(zhí)行多少步。 如果移動(dòng)次數(shù)小于指定的傾斜系數(shù),則為匹配。 QueryParser將表達(dá)式“ hello world” PhraseQuery解析為PhraseQuery ,其PhraseQuery因子為2,允許對(duì)短語(yǔ)“ world hello”,“ hello world”,“ hello * world”和“ hello * * world”進(jìn)行匹配,其中星號(hào)表示索引中不相關(guān)的單詞。 請(qǐng)注意,“ world * hello”與坡度因子2不匹配。因?yàn)閷⑵浞祷亍?hello world”的步數(shù)為3。將“ world”一詞跳到星號(hào)位置是一個(gè),到“你好”位置是兩個(gè),第三跳完全匹配。
范圍查詢
文本或日期范圍查詢使用帶括號(hào)的語(yǔ)法,在開始詞和結(jié)束詞之間使用TO。 方括號(hào)的類型確定范圍是包含式(方括號(hào))還是排他性(卷曲方括號(hào))。
注意:非日期范圍查詢?cè)谟脩糨斎霑r(shí)不加修改地使用開始和結(jié)束詞。 在{Aardvark TO Zebra}的情況下,這些術(shù)語(yǔ)不小寫。 起始詞和結(jié)束詞不得包含空格,否則解析會(huì)失敗; 只允許使用單個(gè)單詞。 分析器未按開始和結(jié)束條件運(yùn)行。
日期范圍處理
當(dāng)遇到范圍查詢(例如[1/1/03 TO 12/31/03])時(shí),解析器代碼首先嘗試將開始和結(jié)束條件轉(zhuǎn)換為日期。 如果這些術(shù)語(yǔ)是有效日期,則根據(jù)DateFormat.SHORT和寬大的解析,則日期將轉(zhuǎn)換為其內(nèi)部文本表示形式(但是,日期字段索引已超出本文的范圍)。 如果這兩個(gè)術(shù)語(yǔ)中的任何一個(gè)未能解析為有效日期,則它們都將原樣用于文本范圍。
通配符和前綴查詢
如果一個(gè)術(shù)語(yǔ)包含星號(hào)或問(wèn)號(hào),則將其視為WildcardQuery ,除非該術(shù)語(yǔ)僅包含尾部星號(hào),而QueryParser會(huì)將其優(yōu)化為PrefixQuery 。 盡管WildcardQuery API本身支持前導(dǎo)通配符,但QueryParser不允許使用它。 通配符查詢示例是w * ldc?rd ,而查詢前綴*已優(yōu)化為PrefixQuery 。
模糊查詢
Lucene的FuzzyQuery匹配接近指定術(shù)語(yǔ)的術(shù)語(yǔ)。 Levenshtein距離算法確定索引中的詞與指定目標(biāo)詞的接近程度。 “編輯距離”是“ Levenshtein距離”的另一個(gè)術(shù)語(yǔ),是兩個(gè)字符串之間相似度的量度,其中距離的測(cè)量是將一個(gè)字符串轉(zhuǎn)換為另一個(gè)字符串所需的字符刪除,插入或替換的數(shù)量。 例如,“三”和“樹”之間的編輯距離是一,因?yàn)閮H需要?jiǎng)h除一個(gè)字符。 在閾值計(jì)算中使用移動(dòng)數(shù),該計(jì)算是距離與弦長(zhǎng)的比率。 QueryParser支持在詞條上使用尾隨波浪號(hào)的模糊詞條查詢。 例如,搜索wuzza?將找到包含“ fuzzy”和“ wuzzy”的文檔。 編輯距離會(huì)影響得分,例如,較低的編輯距離會(huì)得分較高。
布爾查詢
使用運(yùn)算符AND,OR和NOT在文本上構(gòu)造布爾查詢。 列出的未指定運(yùn)算符的術(shù)語(yǔ)使用隱式運(yùn)算符,默認(rèn)情況下為OR。 abc xyz的查詢將解釋為abc OR xyz。 在術(shù)語(yǔ)前加上NOT排除包含以下術(shù)語(yǔ)的文檔。 否定項(xiàng)必須與至少一個(gè)非否定項(xiàng)組合才能返回文檔。 下表中顯示了每個(gè)大寫單詞運(yùn)算符的快捷方式語(yǔ)法。
a OR ba ba,而不是b + a -b
| 詳細(xì)語(yǔ)法 | 快捷語(yǔ)法 |
| a和b | + a + b |
表格1
QueryParser是一種快速簡(jiǎn)便的方法,可為用戶提供強(qiáng)大的查詢構(gòu)造,但并不適合所有人。 QueryParser無(wú)法創(chuàng)建可以使用API??構(gòu)造的每種查詢。 例如,不能構(gòu)造PhrasePrefixQuery 。 您必須記住,將自由格式查詢解析提供給最終用戶時(shí),所有可用的可能性。 某些查詢可能會(huì)導(dǎo)致性能瓶頸。 內(nèi)置QueryParser使用的語(yǔ)法可能不適合您的需求。 子類化QueryParser可以實(shí)現(xiàn)某些控制,盡管它仍然受到限制。
3.使用索引搜索器創(chuàng)建索引
通常,應(yīng)用程序通常只需要調(diào)用繼承的
Searcher.search(org.apache.lucene.search.Query,int)要么
Searcher.search(org.apache.lucene.search.Query,org.apache.lucene.search.Filter,int)方法。 為了提高性能,我們可以打開indexSearcher其用于所有其他搜索操作。 這是一個(gè)簡(jiǎn)單的示例,說(shuō)明如何在lucene中創(chuàng)建索引并使用indexSearcher搜索該索引。
public void simpleLucene(){Analyzer analyzer = new StandardAnalyzer();// Store the index in memory:Directory directory = new RAMDirectory();// To store an index on disk, use this instead (note that the // parameter true will overwrite the index in that directory// if one exists):// Directory directory = FSDirectory.getDirectory("/tmp/myfiles", true);IndexWriter iwriter = new IndexWriter(directory, analyzer, true);iwriter.setMaxFieldLength(25000);Document doc = new Document();String text = "This is the text to be indexed.";doc.add(new Field("fieldname", text, Field.Store.YES,Field.Index.TOKENIZED));iwriter.addDocument(doc);iwriter.close();// Now search the index:IndexSearcher isearcher = new IndexSearcher(directory);// Parse a simple query that searches for "text":QueryParser parser = new QueryParser("fieldname", analyzer);Query query = parser.parse("text");Hits hits = isearcher.search(query);assertEquals(1, hits.length());// Iterate through the results:for (int i = 0; i < hits.length(); i++){Document hitDoc = hits.doc(i);assertEquals("This is the text to be indexed.", hitDoc.get("fieldname"));}isearcher.close();directory.close();}4.不同類型的查詢
Lucene支持多種查詢。 這里是其中的一些。
4.1術(shù)語(yǔ)查詢
匹配具有包含術(shù)語(yǔ)(未分析)的字段的文檔。 術(shù)語(yǔ)查詢映射到Lucene TermQuery 。 以下匹配文檔,其中用戶字段包含術(shù)語(yǔ)kimchy :
{"term" : { "user" : "kimchy" } }提升也可以與查詢關(guān)聯(lián):
{"term" : { "user" : { "value" : "kimchy", "boost" : 2.0 } } }要么 :
{"term" : { "user" : { "term" : "kimchy", "boost" : 2.0 } } }使用Lucene,可以搜索已使用TermQuery類建立索引的特定單詞。 本教程將把TermQuery搜索與QueryParser搜索進(jìn)行比較,并顯示術(shù)語(yǔ)查詢所涉及的一些細(xì)微差別。
4.2布爾查詢
我們可以使用BooleanQuery API或使用MultiFieldQueryParser在Lucene中運(yùn)行多字段搜索來(lái)解析查詢文本。 例如,如果索引具有2個(gè)字段FirstName和LastName并且如果您需要在FirstName字段中搜索“ John”,在LastName字段中搜索“ Travis”,則可以使用BooleanQuery這樣:
BooleanQuery bq = new BooleanQuery(); Query qf = new TermQuery(new Lucene.Net.Index.Term("FirstName", "John")); Query ql = new TermQuery(new Lucene.Net.Index.Term("LastName", "Travis")); bq.Add(qf, BooleanClause.Occur.MUST); bq.Add(ql, BooleanClause.Occur.MUST); IndexSearcher srchr = new IndexSearcher(@"C:\\indexDir"); srchr.Search(bq);4.3通配符查詢
匹配具有與通配符表達(dá)式匹配(未分析)的字段的文檔。 支持的通配符是*,它匹配任何字符序列(包括空字符),以及?,它匹配任何單個(gè)字符。 請(qǐng)注意,此查詢可能會(huì)很慢,因?yàn)樗枰S多項(xiàng)。 為了防止極慢的通配符查詢,通配符術(shù)語(yǔ)不應(yīng)以通配符*或?之一開頭。 通配符查詢映射到Lucene WildcardQuery。
{"wildcard" : { "user" : "ki*y" } }提升也可以與查詢關(guān)聯(lián):
{"wildcard" : { "user" : { "value" : "ki*y", "boost" : 2.0 } } }要么 :
{"wildcard" : { "user" : { "wildcard" : "ki*y", "boost" : 2.0 } } }該多項(xiàng)查詢?cè)试S控制如何使用rewrite參數(shù)將其重寫。
4.4短語(yǔ)查詢
使用Lucene, PhaseQuery可以用于查詢一系列術(shù)語(yǔ),其中這些術(shù)語(yǔ)不一定必須彼此相鄰或按順序排列。 PhaseQuery對(duì)象的setSlop()方法可用于設(shè)置查詢短語(yǔ)中各個(gè)單詞之間可以包含多少個(gè)單詞。
我們可以這樣使用PhraseQuery ,
Term term1 = new Term(FIELD_CONTENTS, string1); Term term2 = new Term(FIELD_CONTENTS, string2); PhraseQuery phraseQuery = new PhraseQuery(); phraseQuery.add(term1); phraseQuery.add(term2); phraseQuery.setSlop(slop);4.5前綴查詢
匹配具有包含帶有指定前綴(未分析)的術(shù)語(yǔ)的字段的文檔。 前綴查詢映射到Lucene PrefixQuery 。 以下匹配文檔,其中用戶字段包含以ki開頭的術(shù)語(yǔ):
{"prefix" : { "user" : "ki" } }提升也可以與查詢關(guān)聯(lián):
{"prefix" : { "user" : { "value" : "ki", "boost" : 2.0 } } }要么 :
{"prefix" : { "user" : { "prefix" : "ki", "boost" : 2.0 } } }該多項(xiàng)查詢?cè)试S控制如何使用rewrite參數(shù)將其重寫。
4.6 MultiPhraseQuery
內(nèi)置的MultiPhraseQuery絕對(duì)是一種利基查詢,但它可能很有用。 MultiPhraseQuery與PhraseQuery只是它允許每個(gè)職位使用多個(gè)詞。 您可以通過(guò)枚舉所有可能的短語(yǔ)組合并使用BooleanQuery將它們“或”在一起來(lái)實(shí)現(xiàn)相同的邏輯效果,盡管以高性能為代價(jià)。
例如,假設(shè)我們要查找有關(guān)快速狐貍的所有文檔,快速或快速后跟狐貍。 一種方法是執(zhí)行“快速狐貍”或“快速狐貍”查詢。 另一個(gè)選擇是使用MultiPhraseQuery 。
4.7模糊查詢
FuzzyQuery可以分為兩種,一種。 像這樣的查詢模糊&b。 像這樣的字段查詢模糊。 像這樣的查詢模糊–像這樣的查詢模糊,通過(guò)在一個(gè)或多個(gè)字段上運(yùn)行來(lái)查找與提供的文本“相似”的文檔。
{"fuzzy_like_this" : {"fields" : ["name.first", "name.last"],"like_text" : "text like this one","max_query_terms" : 12} } Fuzzy_like_this可以縮短為flt。
Fuzzy_like_this頂級(jí)參數(shù)包括:
- fields ->要對(duì)其運(yùn)行類似查詢的字段列表。 默認(rèn)為_all字段。
- like_text >用于查找喜歡的文檔的文本。
- ignore_tf >應(yīng)該忽略詞頻。 默認(rèn)為false。
- max_query_terms >任何生成的查詢中將包含的最大查詢?cè)~數(shù)。 默認(rèn)為25。
- fuzziness ->術(shù)語(yǔ)變體的最小相似性。 默認(rèn)值為0.5。 請(qǐng)參閱“模糊編輯”一節(jié)。
- prefix_length >變體術(shù)語(yǔ)上必需的公共前綴的長(zhǎng)度。 預(yù)設(shè)為0。
- boost >設(shè)置查詢的增強(qiáng)值。 默認(rèn)為1.0。
- analyzer >將用于分析文本的分析器。 默認(rèn)為與該字段關(guān)聯(lián)的分析器。
模糊化所有以字符串形式提供的術(shù)語(yǔ),然后選擇最佳的n個(gè)差異術(shù)語(yǔ)。 實(shí)際上,這混合了FuzzyQuery和MoreLikeThis的行為,但要特別考慮模糊評(píng)分因素。 這通常為查詢產(chǎn)生良好的結(jié)果,其中用戶可以在多個(gè)字段中提供詳細(xì)信息,并且不了解布爾查詢語(yǔ)法,并且還需要一定程度的模糊匹配和快速查詢。
對(duì)于每個(gè)源項(xiàng),模糊變體都保存在沒有BooleanQuery因子的BooleanQuery (因?yàn)槲覀儾辉谌魏挝臋n中尋找多個(gè)變體的匹配項(xiàng))。 此外,專門的TermQuery用于變體,并且不使用該變體詞的IDF,因?yàn)檫@會(huì)偏愛諸如拼寫錯(cuò)誤之類的罕見詞。 取而代之的是,所有變體都使用相同的IDF排名(源查詢項(xiàng)的排名),這是變體的提升因素。 如果索引中不存在源查詢?cè)~,則使用變體的平均IDF。b。 像這樣的字段查詢模糊
Fuzzy_like_this_field查詢與Fuzzy_like_this查詢相同,只不過(guò)它針對(duì)單個(gè)字段運(yùn)行。 它提供了比一般Fu??zzy_like_this查詢更好的查詢DSL,并支持類型字段查詢(使用類型過(guò)濾器自動(dòng)包裝類型字段以僅匹配特定類型)。
{"fuzzy_like_this_field" : {"name.first" : {"like_text" : "text like this one","max_query_terms" : 12}} }可以將Fuzzy_like_this_field縮短為flt_field。Fuzzy_like_this_field頂級(jí)參數(shù)包括:
- like_text->用于查找喜歡的文檔的文本。
- ignore_tf->應(yīng)該忽略詞頻。 默認(rèn)為false。
- max_query_terms->任何生成的查詢中將包含的最大查詢?cè)~數(shù)。 默認(rèn)為25。
- 模糊性->術(shù)語(yǔ)變體的模糊性。 默認(rèn)值為0.5。 請(qǐng)參閱“模糊編輯”一節(jié)。
- prefix_length->變體術(shù)語(yǔ)上必需的公共前綴的長(zhǎng)度。 預(yù)設(shè)為0。
- boost->設(shè)置查詢的增強(qiáng)值。 默認(rèn)為1.0。
- Analyzer->將用??于分析文本的分析器。 默認(rèn)為與該字段關(guān)聯(lián)的分析器。
4.8 RegexpQuery
regexp查詢?cè)试S您使用正則表達(dá)式術(shù)語(yǔ)查詢。 有關(guān)受支持的正則表達(dá)式語(yǔ)言的詳細(xì)信息,請(qǐng)參見正則表達(dá)式語(yǔ)法。
注意: regexp查詢的性能在很大程度上取決于所選的正則表達(dá)式。 匹配。*之類的內(nèi)容非常慢,而且無(wú)法使用環(huán)視正則表達(dá)式。 如果可能,應(yīng)在正則表達(dá)式開始之前嘗試使用長(zhǎng)前綴。 諸如。*?+之類的通配符匹配器通常會(huì)降低性能。
{"regexp":{"name.first": "s.*y"} }還支持升壓
{"regexp":{"name.first":{"value":"s.*y","boost":1.2}} }您還可以使用特殊標(biāo)志
{"regexp":{"name.first": {"value": "s.*y","flags" : "INTERSECTION|COMPLEMENT|EMPTY"}} }可能的標(biāo)志是ALL , ANYSTRING , AUTOMATON , COMPLEMENT , EMPTY , INTERSECTION , INTERVAL或NONE 。 正則表達(dá)式查詢受regexp和query_string查詢的支持。 Lucene正則表達(dá)式引擎不兼容Perl,但支持較小范圍的運(yùn)算符。
標(biāo)準(zhǔn)運(yùn)營(yíng)商
錨定大多數(shù)正則表達(dá)式引擎允許您匹配字符串的任何部分。 如果您想讓正則表達(dá)式模式從字符串的開頭開始或在字符串的末尾結(jié)束,則必須專門將其錨定,使用^表示開始或使用$表示結(jié)束.Lucene的模式始終被錨定。 提供的模式必須與整個(gè)字符串匹配。 對(duì)于字符串“ abcde” :
ab.* # matchabcd # no match允許的字符
模式中可以使用任何Unicode字符,但是某些字符是保留的,必須轉(zhuǎn)義。 標(biāo)準(zhǔn)保留字符為:
。 ? + * | {} []()” \
如果啟用了可選功能(請(qǐng)參見下文),則這些字符也可能被保留:
#@&<>?
任何保留的字符都可以使用反斜杠“ \ *”進(jìn)行轉(zhuǎn)義,包括文字反斜杠字符:
“ \\”
此外,任何字符(雙引號(hào)除外)在被雙引號(hào)括起來(lái)時(shí)都將按字面意義進(jìn)行解釋:
約翰” @ smith.com”
匹配任何字符
時(shí)期 ”。” 可以用來(lái)代表任何字符。 對(duì)于字符串“ abcde”:
ab... # matcha.c.e # match一個(gè)或多個(gè)
加號(hào)“ +”可用于一次或多次重復(fù)前面的最短模式。 對(duì)于字符串“ aaabbb”:
a+b+ # matchaa+bb+ # matcha+.+ # matchaa+bbb+ # no match零或更多
星號(hào)“ *”可用于匹配前面的最短模式零次或多次。 對(duì)于字符串“ aaabbb”:
a*b* # matcha*b*c* # match.*bbb.* # matchaaa*bbb* # match零或一
問(wèn)號(hào)“?” 使前面的最短模式為可選。 它匹配零或一倍。 對(duì)于字符串“ aaabbb”:
aaa?bbb? # matchaaaa?bbbb? # match.....?.? # matchaa?bb? # no match最小到最大
可以使用花括號(hào)“ {}”指定前面的最短模式可以重復(fù)的最小次數(shù)和(可選)最大次數(shù)。 允許的形式為:
{5} # repeat exactly 5 times{2,5} # repeat at least twice and at most 5 times{2,} # repeat at least twice對(duì)于字符串“ aaabbb”:
a{3}b{3} # matcha{2,4}b{2,4} # matcha{2,}b{2,} # match.{3}.{3} # matcha{4}b{4} # no matcha{4,6}b{4,6} # no matcha{4,}b{4,} # no match分組
括號(hào)“()”可用于形成子模式。 上面列出的數(shù)量運(yùn)算符以最短的先前模式進(jìn)行操作,該模式可以是一組。 對(duì)于字符串“ ababab”:
(ab)+ # matchab(ab)+ # match(..)+ # match(...)+ # no match(ab)* # matchabab(ab)? # matchab(ab)? # no match(ab){3} # match(ab){1,2} # no match輪換
管道符號(hào)“ |” 充當(dāng)OR運(yùn)算符。 如果左側(cè)或右側(cè)的圖案匹配,則匹配成功。 交替適用于最長(zhǎng)的模式,而不是最短的模式。 對(duì)于字符串“ aabb”:
aabb|bbaa # matchaacc|bb # no match aa(cc|bb) # matcha+|b+ # no matcha+b+|b+a+ # matcha+(b|c)+ # match角色類
潛在字符的范圍可以通過(guò)將它們括在方括號(hào)“ []”中來(lái)表示為字符類。 前導(dǎo)^否定字符類。 允許的形式為:
[abc] # 'a' or 'b' or 'c'[a-c] # 'a' or 'b' or 'c'[-abc] # '-' or 'a' or 'b' or 'c'[abc\\-] # '-' or 'a' or 'b' or 'c'[^a-c] # any character except 'a' or 'b' or 'c'[^a-c] # any character except 'a' or 'b' or 'c'[-abc] # '-' or 'a' or 'b' or 'c'[abc\\-] # '-' or 'a' or 'b' or 'c'請(qǐng)注意,破折號(hào)“-”表示字符范圍,除非它是第一個(gè)字符或用反斜杠轉(zhuǎn)義。對(duì)于字符串“ abcd”:
ab[cd]+ # match[a-d]+ # match[^a-d]+ # no match4.9 TermRangeQuery
一個(gè)Query ,該Query匹配一系列術(shù)語(yǔ)內(nèi)的文檔。 此查詢尋找字詞落入根據(jù)提供的范圍中的文件相匹配String#compareTo(String) ,除非一個(gè)Collator被提供。 它不適用于數(shù)字范圍。
這是一個(gè)如何在lucene中使用TermRangeQuery的示例,
private Query createQuery(String field, DateOperator dop) throws UnsupportedSearchException { Date date = dop.getDate(); DateResolution res = dop.getDateResultion(); DateTools.Resolution dRes = toResolution(res); String value = DateTools.dateToString(date, dRes); switch(dop.getType()) {case ON:return new TermQuery(new Term(field ,value));case BEFORE: return new TermRangeQuery(field, DateTools.dateToString(MIN_DATE, dRes), value, true, false);case AFTER: return new TermRangeQuery(field, value, DateTools.dateToString(MAX_DATE, dRes), false, true);default:throw new UnsupportedSearchException();} }4.10 NumericRangeQuery
一個(gè)NumericRangeQuery ,它匹配指定范圍內(nèi)的數(shù)值。 要使用此功能,您必須首先為數(shù)字索引。我們可以將NumericRangeQuery與TermQuery結(jié)合使用,
String termQueryString = "title:\\"hello world\\""; Query termQuery = parser.parse(termQueryString); Query pageQueryRange = NumericRangeQuery.newIntRange("page_count", 10, 20, true, true); Query query = termQuery.combine(new Query[]{termQuery, pageQueryRange});4.11 ConstantScoreQuery
包含另一個(gè)查詢或過(guò)濾器的查詢,對(duì)于與過(guò)濾器或查詢匹配的每個(gè)文檔,僅返回等于查詢提升的常數(shù)分?jǐn)?shù)。 因此,對(duì)于查詢,它僅去除所有分?jǐn)?shù)并返回一個(gè)常數(shù)。
{"constant_score" : {"filter" : {"term" : { "user" : "kimchy"}},"boost" : 1.2} }過(guò)濾器對(duì)象只能容納過(guò)濾器元素,不能容納查詢。 過(guò)濾器比查詢查詢要快得多,因?yàn)樗鼈儾粓?zhí)行任何評(píng)分,尤其是在緩存時(shí)。查詢還可以包裝在constant_score查詢中:
{"constant_score" : {"query" : {"term" : { "user" : "kimchy"}},"boost" : 1.2} }4.12 DisjunctionMaxQuery
一個(gè)查詢,該查詢生成由其子查詢生成的文檔并集,并用任何子查詢生成的該文檔的最高分?jǐn)?shù)對(duì)每個(gè)文檔評(píng)分,并為任何其他匹配的子查詢加上平局打破增量。
在多個(gè)具有不同提升因子的字段中搜索單詞時(shí),這很有用(這樣就無(wú)法將這些字段等效地組合到單個(gè)搜索字段中)。 我們希望主要分?jǐn)?shù)是與最高提升相關(guān)的分?jǐn)?shù),而不是字段分?jǐn)?shù)的總和(如布爾查詢所給出的那樣)。 如果查詢是“白化大象”,則這確保匹配一個(gè)字段的“白化”和匹配另一個(gè)字段的“大象”獲得比匹配兩個(gè)字段的“白化”更高的分?jǐn)?shù)。 要獲得此結(jié)果,請(qǐng)同時(shí)使用Boolean Query和DisjunctionMaxQuery :對(duì)于每個(gè)術(shù)語(yǔ),DisjunctionMaxQuery在每個(gè)字段中進(jìn)行搜索,同時(shí)將這些DisjunctionMaxQuery的集合組合為BooleanQuery 。
打破平局能力使在多個(gè)字段中包含相同術(shù)語(yǔ)的結(jié)果比僅在多個(gè)字段中最好的包含該術(shù)語(yǔ)的結(jié)果更好地進(jìn)行判斷,而不會(huì)與多個(gè)字段中兩個(gè)不同術(shù)語(yǔ)的更好情況相混淆。默認(rèn)的tie_breaker是0.0。此查詢映射到Lucene DisjunctionMaxQuery 。
{"dis_max" : {"tie_breaker" : 0.7,"boost" : 1.2,"queries" : [{"term" : { "age" : 34 }},{"term" : { "age" : 35 }}]} }4.13 MatchAllDocsQuery
與所有文檔匹配的查詢。 映射到Lucene MatchAllDocsQuery 。
{"match_all" : { } }哪些也可以與之關(guān)聯(lián):
{"match_all" : { "boost" : 1.2 } }翻譯自: https://www.javacodegeeks.com/2015/09/integrating-lucene-search-into-an-application.html
總結(jié)
以上是生活随笔為你收集整理的将Lucene搜索集成到应用程序中的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ddos 放大(ddos放大系数)
- 下一篇: python图形界面教程_图形教程