自定义的Sort对象
生活随笔
收集整理的這篇文章主要介紹了
自定义的Sort对象
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先,我們應該有一個概念,在Lucene的內置排序方法中,升降序規則默認都是natural ording,即在Sorting by relevance中默認desc,在其他排序中則是asc。 1.Sorting by relevance,中文可以叫"適當的排序"?好象有點別扭,呵呵.這也是Lucene的默認排序,即按評分結果倒序排列.
????? 以下幾種search方法都是實現的同樣的效果:
????? search(Query query,null),search(Query query,Sort.RELEVANCE),search(Query query,new Sort())
????? 結果首先按照評分結果desc排序,如果評分相同,則按照document id asc排序,其中,document id是document在索引時的先后順序。
??? 2.Sorting by index order,按照索引的先后順序asc排列。
??? 3.Sorting by a field,按field排序。field是在索引時建立的單元。這里需要注意的一點是,如果想按照field來排序,需要幾個規則:首先,這個 field必須是indexed and not tokenized,就是需要索引,但是不能分詞,例如Field.KEYWORD()方法;這個field必須可以轉換成 Integers,Floats,Strings,可以在用Field生成Sort對象的時候指定field的類型。
???
??? 正像前邊提到的,在lucene中的默認結果升降序規則是natural ording,當然我們也可以自己指定排序的升降序規則。
??? 首先,我們指定結果按照某一個field來desc排序(如果不指定,field是按照asc排序)。例 如,IndexSearcher.search(Query query,new Sort("date",true)),這里參數true的作用既是使得結果按照date field按照降序排列,這樣我們就可以將日期最近的結果排列到最前面。
??? 通常,排序規則不會這么簡單。例如,在某一個圖書查詢系統中,我們需要的排序規則是,首先按照圖書的目錄排序,然后同一目錄的圖書按照評分結果排序,評分結果相同并且目錄相同的圖書按照出版日期降序排列,代碼片段如下:
??? indexSearcher.search(Query query,new Sort(
??????? new SortField[]{
??????????? new SortField("category"),
??????????? SortField.FIELD_SCORE,
??????????? new SortField("pubmonth", SortField.INT, true)
??????? }
??? )
??? 這里,我們指定了一個SortField的數組,圖書目錄按照字典升序排列,然后目錄相同的按照評分結果降序排列,最后按照出版日期降序排列。
??? 其實,在lucene內部自動維護了一個排序的數組,只是在這個例子中,我們顯示的指定了排序的規則而已。
??? 排序對查詢性能的影響。排序需要額外的資源消耗,更多的內存消耗。lucene只是緩存實際需要排序的field。即使如此,如果需要自定義排序,仍然需要仔細的規劃,記住,按照一個String來排序將花費最大的資源。
????? 以下幾種search方法都是實現的同樣的效果:
????? search(Query query,null),search(Query query,Sort.RELEVANCE),search(Query query,new Sort())
????? 結果首先按照評分結果desc排序,如果評分相同,則按照document id asc排序,其中,document id是document在索引時的先后順序。
??? 2.Sorting by index order,按照索引的先后順序asc排列。
??? 3.Sorting by a field,按field排序。field是在索引時建立的單元。這里需要注意的一點是,如果想按照field來排序,需要幾個規則:首先,這個 field必須是indexed and not tokenized,就是需要索引,但是不能分詞,例如Field.KEYWORD()方法;這個field必須可以轉換成 Integers,Floats,Strings,可以在用Field生成Sort對象的時候指定field的類型。
???
??? 正像前邊提到的,在lucene中的默認結果升降序規則是natural ording,當然我們也可以自己指定排序的升降序規則。
??? 首先,我們指定結果按照某一個field來desc排序(如果不指定,field是按照asc排序)。例 如,IndexSearcher.search(Query query,new Sort("date",true)),這里參數true的作用既是使得結果按照date field按照降序排列,這樣我們就可以將日期最近的結果排列到最前面。
??? 通常,排序規則不會這么簡單。例如,在某一個圖書查詢系統中,我們需要的排序規則是,首先按照圖書的目錄排序,然后同一目錄的圖書按照評分結果排序,評分結果相同并且目錄相同的圖書按照出版日期降序排列,代碼片段如下:
??? indexSearcher.search(Query query,new Sort(
??????? new SortField[]{
??????????? new SortField("category"),
??????????? SortField.FIELD_SCORE,
??????????? new SortField("pubmonth", SortField.INT, true)
??????? }
??? )
??? 這里,我們指定了一個SortField的數組,圖書目錄按照字典升序排列,然后目錄相同的按照評分結果降序排列,最后按照出版日期降序排列。
??? 其實,在lucene內部自動維護了一個排序的數組,只是在這個例子中,我們顯示的指定了排序的規則而已。
??? 排序對查詢性能的影響。排序需要額外的資源消耗,更多的內存消耗。lucene只是緩存實際需要排序的field。即使如此,如果需要自定義排序,仍然需要仔細的規劃,記住,按照一個String來排序將花費最大的資源。
轉載于:https://www.cnblogs.com/lcuzhanglei/archive/2012/08/01/2618467.html
總結
以上是生活随笔為你收集整理的自定义的Sort对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lucene排序以及自定义排序
- 下一篇: java getcurrentpid