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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

将Lucene搜索集成到应用程序中

發布時間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 将Lucene搜索集成到应用程序中 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文是我們名為“ Apache Lucene基礎知識 ”的學院課程的一部分。

在本課程中,您將了解Lucene。 您將了解為什么這樣的庫很重要,然后了解Lucene中搜索的工作方式。 此外,您將學習如何將Lucene Search集成到您自己的應用程序中,以提供強大的搜索功能。 在這里查看 !

目錄

1.簡介 2.解析查詢字符串
2.1。 QueryParser的規則 2.2。 使用QueryParser 2.3。 QueryParser表達式語法
3.使用索引搜索器創建索引 4.不同類型的查詢
4.1術語查詢 4.2布爾查詢 4.3通配符查詢 4.4短語查詢 4.5前綴查詢 4.6 MultiPhraseQuery 4.7模糊查詢 4.8 RegexpQuery 4.9 TermRangeQuery 4.10 NumericRangeQuery 4.11 ConstantScoreQuery 4.12 DisjunctionMaxQuery 4.13 MatchAllDocsQuery

1.簡介

Java Lucene提供了一種功能非常強大的查詢語言,用于對大量數據執行搜索操作。

查詢分為術語和運算符。 術語共有三種: 單項短語子查詢 。 單個術語是一個單詞,例如“ test”或“ hello”。 短語是一組用雙引號括起來的單詞,例如“ hello dolly”。 子查詢是用括號括起來的查詢,例如“(hello dolly)”。

Lucene支持數據字段。 執行搜索時,您可以指定一個字段,也可以使用默認字段。 字段名稱取決于索引數據,默認字段由當前設置定義。

2.解析查詢字符串

查詢解析器的工作是將用戶提交的查詢字符串轉換為查詢對象。

查詢由解析器解析其內容。 這是一個例子:

{"query_string" : {"default_field" : "content","query" : "this AND that OR thus"} }

query_string頂級參數包括:

參數 描述
query 要解析的實際查詢。
default_field 如果未指定前綴字段,則為查詢詞的默認字段。 默認為index.query.default_field索引設置,而索引設置又默認為_all。
default_operator 如果未指定顯式運算符,則使用默認運算符。 例如,使用OR的默認運算符,匈牙利的查詢大寫被轉換為OR匈牙利的大寫OR,使用AND的默認運算符,相同的查詢被轉換為AND匈牙利的大寫AND。 默認值為“或”。
analyzer 用于分析查詢字符串的分析器名稱。
allow_leading_wildcard 設置時,*或? 允許作為第一個字符。 默認為true。
lowercase_expanded_terms 通配符,前綴,模糊和范圍查詢的術語是否要自動小寫(因為未對其進行分析)。 默認為true。
enable_position_increments 設置為true以在結果查詢中啟用位置增量。 默認為true。
fuzzy_max_expansions 控制模糊查詢將擴展到的術語數量。 默認為50
fuzziness 設置模糊查詢的模糊性。 默認為自動。
fuzzy_prefix_length 設置模糊查詢的前綴長度。 默認值為0。
phrase_slop 設置短語的默認斜率。 如果為零,則需要精確的短語匹配。 預設值為0。
boost 設置查詢的提升值。 默認為1.0。
analyze_wildcard 默認情況下,不分析查詢字符串中的通配符術語。 通過將此值設置為true,也將盡最大努力對這些值進行分析。
auto_generate_phrase_queries 默認為false。
minimum_should_match 一個值,該值控制在結果布爾查詢中應匹配多少個“應該”子句。 它可以是絕對值(2),百分比(30%)或兩者的組合。
lenient 如果設置為true,將導致忽略基于格式的錯誤(例如,向數字字段提供文本)。
locale [1.1.0]在1.1.0.Locale中添加,應用于字符串轉換。 默認為ROOT。

表格1

生成多詞查詢時,可以使用rewrite參數控制如何重寫它。

QueryParser的規則

假設您正在Web上搜索同時包含單詞java和net但不包含單詞dot的頁面。 如果搜索引擎讓您為此簡單查詢輸入類似以下內容,該怎么辦?

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);

那將是真正的阻力。 幸運的是,Google,Nutch和其他搜索引擎比這更友好,允許您輸入更簡潔的內容: java AND net NOT dot 。首先,我們將了解在應用程序中使用QueryParser涉及的內容。

使用QueryParser

使用QueryParser非常簡單。 需要三件事:表達式,用于表達式中非限定字段的默認字段名稱以及用于分析表達式片段的分析器。字段選擇限定符在查詢語法部分中討論。 “分析癱瘓”部分介紹了特定于查詢解析的分析。 現在,讓我們分析一個表達式:

String humanQuery = getHumanQuery(); Query query = QueryParser.parse(humanQuery, "contents", new StandardAnalyzer());

一旦獲得Query對象,就可以像直接通過API創建查詢一樣進行搜索。 這是使用用戶輸入的查詢字符串搜索現有索引并將結果顯示到控制臺的完整方法:

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"));} }

根據簡單的語法分析傳遞給QueryParser表達式。 遇到非法表達式時, QueryParser引發ParseException 。

QueryParser表達式語法

本節中的以下各項描述QueryParser支持創建各種查詢類型的語法。

單項查詢

僅一個單詞的查詢字符串將轉換為基礎TermQuery 。

詞組查詢

要在一個字段中一起搜索一組單詞,請用雙引號將單詞引起來。 查詢“ hello world”對應于精確的詞組匹配,要求“ hello”和“ world”是匹配的連續項。 Lucene還支持草率的短語查詢,其中引號之間的術語不必嚴格按順序排列。 斜率因子衡量將術語重新排列為準確順序需要執行多少步。 如果移動次數小于指定的傾斜系數,則為匹配。 QueryParser將表達式“ hello world” PhraseQuery解析為PhraseQuery ,其PhraseQuery因子為2,允許對短語“ world hello”,“ hello world”,“ hello * world”和“ hello * * world”進行匹配,其中星號表示索引中不相關的單詞。 請注意,“ world * hello”與坡度因子2不匹配。因為將其返回“ hello world”的步數為3。將“ world”一詞跳到星號位置是一個,到“你好”位置是兩個,第三跳完全匹配。

范圍查詢

文本或日期范圍查詢使用帶括號的語法,在開始詞和結束詞之間使用TO。 方括號的類型確定范圍是包含式(方括號)還是排他性(卷曲方括號)。

注意:非日期范圍查詢在用戶輸入時不加修改地使用開始和結束詞。 在{Aardvark TO Zebra}的情況下,這些術語不小寫。 起始詞和結束詞不得包含空格,否則解析會失敗; 只允許使用單個單詞。 分析器未按開始和結束條件運行。

日期范圍處理

當遇到范圍查詢(例如[1/1/03 TO 12/31/03])時,解析器代碼首先嘗試將開始和結束條件轉換為日期。 如果這些術語是有效日期,則根據DateFormat.SHORT和寬大的解析,則日期將轉換為其內部文本表示形式(但是,日期字段索引已超出本文的范圍)。 如果這兩個術語中的任何一個未能解析為有效日期,則它們都將原樣用于文本范圍。

通配符和前綴查詢

如果一個術語包含星號或問號,則將其視為WildcardQuery ,除非該術語僅包含尾部星號,而QueryParser會將其優化為PrefixQuery 。 盡管WildcardQuery API本身支持前導通配符,但QueryParser不允許使用它。 通配符查詢示例是w * ldc?rd ,而查詢前綴*已優化為PrefixQuery 。

模糊查詢

Lucene的FuzzyQuery匹配接近指定術語的術語。 Levenshtein距離算法確定索引中的詞與指定目標詞的接近程度。 “編輯距離”是“ Levenshtein距離”的另一個術語,是兩個字符串之間相似度的量度,其中距離的測量是將一個字符串轉換為另一個字符串所需的字符刪除,插入或替換的數量。 例如,“三”和“樹”之間的編輯距離是一,因為僅需要刪除一個字符。 在閾值計算中使用移動數,該計算是距離與弦長的比率。 QueryParser支持在詞條上使用尾隨波浪號的模糊詞條查詢。 例如,搜索wuzza?將找到包含“ fuzzy”和“ wuzzy”的文檔。 編輯距離會影響得分,例如,較低的編輯距離會得分較高。

布爾查詢

使用運算符AND,OR和NOT在文本上構造布爾查詢。 列出的未指定運算符的術語使用隱式運算符,默認情況下為OR。 abc xyz的查詢將解釋為abc OR xyz。 在術語前加上NOT排除包含以下術語的文檔。 否定項必須與至少一個非否定項組合才能返回文檔。 下表中顯示了每個大寫單詞運算符的快捷方式語法。

a OR ba ba,而不是b + a -b

詳細語法 快捷語法
a和b + a + b

表格1

QueryParser是一種快速簡便的方法,可為用戶提供強大的查詢構造,但并不適合所有人。 QueryParser無法創建可以使用API??構造的每種查詢。 例如,不能構造PhrasePrefixQuery 。 您必須記住,將自由格式查詢解析提供給最終用戶時,所有可用的可能性。 某些查詢可能會導致性能瓶頸。 內置QueryParser使用的語法可能不適合您的需求。 子類化QueryParser可以實現某些控制,盡管它仍然受到限制。

3.使用索引搜索器創建索引

通常,應用程序通常只需要調用繼承的

Searcher.search(org.apache.lucene.search.Query,int)

要么

Searcher.search(org.apache.lucene.search.Query,org.apache.lucene.search.Filter,int)

方法。 為了提高性能,我們可以打開indexSearcher其用于所有其他搜索操作。 這是一個簡單的示例,說明如何在lucene中創建索引并使用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支持多種查詢。 這里是其中的一些。

  • 術語查詢
  • 布爾查詢
  • 通配符查詢
  • 詞組查詢
  • 前綴查詢
  • 多詞查詢
  • 模糊查詢
  • 正則表達式查詢
  • TermRangeQuery
  • NumericRangeQuery
  • ConstantScoreQuery
  • DisjunctionMaxQuery
  • MatchAllDocsQuery
  • 4.1術語查詢

    匹配具有包含術語(未分析)的字段的文檔。 術語查詢映射到Lucene TermQuery 。 以下匹配文檔,其中用戶字段包含術語kimchy

    {"term" : { "user" : "kimchy" } }

    提升也可以與查詢關聯:

    {"term" : { "user" : { "value" : "kimchy", "boost" : 2.0 } } }

    要么 :

    {"term" : { "user" : { "term" : "kimchy", "boost" : 2.0 } } }

    使用Lucene,可以搜索已使用TermQuery類建立索引的特定單詞。 本教程將把TermQuery搜索與QueryParser搜索進行比較,并顯示術語查詢所涉及的一些細微差別。

    4.2布爾查詢

    我們可以使用BooleanQuery API或使用MultiFieldQueryParser在Lucene中運行多字段搜索來解析查詢文本。 例如,如果索引具有2個字段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通配符查詢

    匹配具有與通配符表達式匹配(未分析)的字段的文檔。 支持的通配符是*,它匹配任何字符序列(包括空字符),以及?,它匹配任何單個字符。 請注意,此查詢可能會很慢,因為它需要迭代許多項。 為了防止極慢的通配符查詢,通配符術語不應以通配符*或?之一開頭。 通配符查詢映射到Lucene WildcardQuery。

    {"wildcard" : { "user" : "ki*y" } }

    提升也可以與查詢關聯:

    {"wildcard" : { "user" : { "value" : "ki*y", "boost" : 2.0 } } }

    要么 :

    {"wildcard" : { "user" : { "wildcard" : "ki*y", "boost" : 2.0 } } }

    該多項查詢允許控制如何使用rewrite參數將其重寫。

    4.4短語查詢

    使用Lucene, PhaseQuery可以用于查詢一系列術語,其中這些術語不一定必須彼此相鄰或按順序排列。 PhaseQuery對象的setSlop()方法可用于設置查詢短語中各個單詞之間可以包含多少個單詞。

    我們可以這樣使用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前綴查詢

    匹配具有包含帶有指定前綴(未分析)的術語的字段的文檔。 前綴查詢映射到Lucene PrefixQuery 。 以下匹配文檔,其中用戶字段包含以ki開頭的術語:

    {"prefix" : { "user" : "ki" } }

    提升也可以與查詢關聯:

    {"prefix" : { "user" : { "value" : "ki", "boost" : 2.0 } } }

    要么 :

    {"prefix" : { "user" : { "prefix" : "ki", "boost" : 2.0 } } }

    該多項查詢允許控制如何使用rewrite參數將其重寫。

    4.6 MultiPhraseQuery

    內置的MultiPhraseQuery絕對是一種利基查詢,但它可能很有用。 MultiPhraseQuery與PhraseQuery只是它允許每個職位使用多個詞。 您可以通過枚舉所有可能的短語組合并使用BooleanQuery將它們“或”在一起來實現相同的邏輯效果,盡管以高性能為代價。

    例如,假設我們要查找有關快速狐貍的所有文檔,快速或快速后跟狐貍。 一種方法是執行“快速狐貍”或“快速狐貍”查詢。 另一個選擇是使用MultiPhraseQuery 。

    4.7模糊查詢

    FuzzyQuery可以分為兩種,一種。 像這樣的查詢模糊&b。 像這樣的字段查詢模糊。 像這樣的查詢模糊–像這樣的查詢模糊,通過在一個或多個字段上運行來查找與提供的文本“相似”的文檔。

    {"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頂級參數包括:

    • fields ->要對其運行類似查詢的字段列表。 默認為_all字段。
    • like_text >用于查找喜歡的文檔的文本。
    • ignore_tf >應該忽略詞頻。 默認為false。
    • max_query_terms >任何生成的查詢中將包含的最大查詢詞數。 默認為25。
    • fuzziness ->術語變體的最小相似性。 默認值為0.5。 請參閱“模糊編輯”一節。
    • prefix_length >變體術語上必需的公共前綴的長度。 預設為0。
    • boost >設置查詢的增強值。 默認為1.0。
    • analyzer >將用于分析文本的分析器。 默認為與該字段關聯的分析器。

    模糊化所有以字符串形式提供的術語,然后選擇最佳的n個差異術語。 實際上,這混合了FuzzyQuery和MoreLikeThis的行為,但要特別考慮模糊評分因素。 這通常為查詢產生良好的結果,其中用戶可以在多個字段中提供詳細信息,并且不了解布爾查詢語法,并且還需要一定程度的模糊匹配和快速查詢。

    對于每個源項,模糊變體都保存在沒有BooleanQuery因子的BooleanQuery (因為我們不在任何文檔中尋找多個變體的匹配項)。 此外,專門的TermQuery用于變體,并且不使用該變體詞的IDF,因為這會偏愛諸如拼寫錯誤之類的罕見詞。 取而代之的是,所有變體都使用相同的IDF排名(源查詢項的排名),這是變體的提升因素。 如果索引中不存在源查詢詞,則使用變體的平均IDF。b。 像這樣的字段查詢模糊

    Fuzzy_like_this_field查詢與Fuzzy_like_this查詢相同,只不過它針對單個字段運行。 它提供了比一般Fu??zzy_like_this查詢更好的查詢DSL,并支持類型字段查詢(使用類型過濾器自動包裝類型字段以僅匹配特定類型)。

    {"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頂級參數包括:

    • like_text->用于查找喜歡的文檔的文本。
    • ignore_tf->應該忽略詞頻。 默認為false。
    • max_query_terms->任何生成的查詢中將包含的最大查詢詞數。 默認為25。
    • 模糊性->術語變體的模糊性。 默認值為0.5。 請參閱“模糊編輯”一節。
    • prefix_length->變體術語上必需的公共前綴的長度。 預設為0。
    • boost->設置查詢的增強值。 默認為1.0。
    • Analyzer->將用??于分析文本的分析器。 默認為與該字段關聯的分析器。

    4.8 RegexpQuery

    regexp查詢允許您使用正則表達式術語查詢。 有關受支持的正則表達式語言的詳細信息,請參見正則表達式語法。

    注意: regexp查詢的性能在很大程度上取決于所選的正則表達式。 匹配。*之類的內容非常慢,而且無法使用環視正則表達式。 如果可能,應在正則表達式開始之前嘗試使用長前綴。 諸如。*?+之類的通配符匹配器通常會降低性能。

    {"regexp":{"name.first": "s.*y"} }

    還支持升壓

    {"regexp":{"name.first":{"value":"s.*y","boost":1.2}} }

    您還可以使用特殊標志

    {"regexp":{"name.first": {"value": "s.*y","flags" : "INTERSECTION|COMPLEMENT|EMPTY"}} }

    可能的標志是ALL , ANYSTRING , AUTOMATON , COMPLEMENT , EMPTY , INTERSECTION , INTERVAL或NONE 。 正則表達式查詢受regexp和query_string查詢的支持。 Lucene正則表達式引擎不兼容Perl,但支持較小范圍的運算符。

    標準運營商

    錨定大多數正則表達式引擎允許您匹配字符串的任何部分。 如果您想讓正則表達式模式從字符串的開頭開始或在字符串的末尾結束,則必須專門將其錨定,使用^表示開始或使用$表示結束.Lucene的模式始終被錨定。 提供的模式必須與整個字符串匹配。 對于字符串“ abcde”

    ab.* # matchabcd # no match

    允許的字符

    模式中可以使用任何Unicode字符,但是某些字符是保留的,必須轉義。 標準保留字符為:

    。 ? + * | {} []()” \

    如果啟用了可選功能(請參見下文),則這些字符也可能被保留:

    #@&<>?

    任何保留的字符都可以使用反斜杠“ \ *”進行轉義,包括文字反斜杠字符:

    “ \\”

    此外,任何字符(雙引號除外)在被雙引號括起來時都將按字面意義進行解釋:

    約翰” @ smith.com”

    匹配任何字符

    時期 ”。” 可以用來代表任何字符。 對于字符串“ abcde”:

    ab... # matcha.c.e # match

    一個或多個

    加號“ +”可用于一次或多次重復前面的最短模式。 對于字符串“ aaabbb”:

    a+b+ # matchaa+bb+ # matcha+.+ # matchaa+bbb+ # no match

    零或更多

    星號“ *”可用于匹配前面的最短模式零次或多次。 對于字符串“ aaabbb”:

    a*b* # matcha*b*c* # match.*bbb.* # matchaaa*bbb* # match

    零或一

    問號“?” 使前面的最短模式為可選。 它匹配零或一倍。 對于字符串“ aaabbb”:

    aaa?bbb? # matchaaaa?bbbb? # match.....?.? # matchaa?bb? # no match

    最小到最大

    可以使用花括號“ {}”指定前面的最短模式可以重復的最小次數和(可選)最大次數。 允許的形式為:

    {5} # repeat exactly 5 times{2,5} # repeat at least twice and at most 5 times{2,} # repeat at least twice

    對于字符串“ 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

    分組

    括號“()”可用于形成子模式。 上面列出的數量運算符以最短的先前模式進行操作,該模式可以是一組。 對于字符串“ ababab”:

    (ab)+ # matchab(ab)+ # match(..)+ # match(...)+ # no match(ab)* # matchabab(ab)? # matchab(ab)? # no match(ab){3} # match(ab){1,2} # no match

    輪換

    管道符號“ |” 充當OR運算符。 如果左側或右側的圖案匹配,則匹配成功。 交替適用于最長的模式,而不是最短的模式。 對于字符串“ aabb”:

    aabb|bbaa # matchaacc|bb # no match aa(cc|bb) # matcha+|b+ # no matcha+b+|b+a+ # matcha+(b|c)+ # match

    角色類

    潛在字符的范圍可以通過將它們括在方括號“ []”中來表示為字符類。 前導^否定字符類。 允許的形式為:

    [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'

    請注意,破折號“-”表示字符范圍,除非它是第一個字符或用反斜杠轉義。對于字符串“ abcd”:

    ab[cd]+ # match[a-d]+ # match[^a-d]+ # no match

    4.9 TermRangeQuery

    一個Query ,該Query匹配一系列術語內的文檔。 此查詢尋找字詞落入根據提供的范圍中的文件相匹配String#compareTo(String) ,除非一個Collator被提供。 它不適用于數字范圍。

    這是一個如何在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

    一個NumericRangeQuery ,它匹配指定范圍內的數值。 要使用此功能,您必須首先為數字索引。我們可以將NumericRangeQuery與TermQuery結合使用,

    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

    包含另一個查詢或過濾器的查詢,對于與過濾器或查詢匹配的每個文檔,僅返回等于查詢提升的常數分數。 因此,對于查詢,它僅去除所有分數并返回一個常數。

    {"constant_score" : {"filter" : {"term" : { "user" : "kimchy"}},"boost" : 1.2} }

    過濾器對象只能容納過濾器元素,不能容納查詢。 過濾器比查詢查詢要快得多,因為它們不執行任何評分,尤其是在緩存時。查詢還可以包裝在constant_score查詢中:

    {"constant_score" : {"query" : {"term" : { "user" : "kimchy"}},"boost" : 1.2} }

    4.12 DisjunctionMaxQuery

    一個查詢,該查詢生成由其子查詢生成的文檔并集,并用任何子查詢生成的該文檔的最高分數對每個文檔評分,并為任何其他匹配的子查詢加上平局打破增量。

    在多個具有不同提升因子的字段中搜索單詞時,這很有用(這樣就無法將這些字段等效地組合到單個搜索字段中)。 我們希望主要分數是與最高提升相關的分數,而不是字段分數的總和(如布爾查詢所給出的那樣)。 如果查詢是“白化大象”,則這確保匹配一個字段的“白化”和匹配另一個字段的“大象”獲得比匹配兩個字段的“白化”更高的分數。 要獲得此結果,請同時使用Boolean Query和DisjunctionMaxQuery :對于每個術語,DisjunctionMaxQuery在每個字段中進行搜索,同時將這些DisjunctionMaxQuery的集合組合為BooleanQuery 。

    打破平局能力使在多個字段中包含相同術語的結果比僅在多個字段中最好的包含該術語的結果更好地進行判斷,而不會與多個字段中兩個不同術語的更好情況相混淆。默認的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" : { } }

    哪些也可以與之關聯:

    {"match_all" : { "boost" : 1.2 } }

    翻譯自: https://www.javacodegeeks.com/2015/09/integrating-lucene-search-into-an-application.html

    總結

    以上是生活随笔為你收集整理的将Lucene搜索集成到应用程序中的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。