solr的隨機排序 【轉載】

 原文地址:http://blog.csdn.net/duck_genuine/article/details/8477336java

 

有這樣的一種需求,想從索引庫裏隨機取出4條記錄。算法

在 schema.xml:配置一個動態字段,以下。具體實現能夠看代碼 org.apache.solr.schema.RandomSortFieldapache

 1     <types>  
 2      ...  
 3      <fieldType name="random" class="solr.RandomSortField" />  
 4      ...   
 5     </types>  
 6     <fields>  
 7      ...  
 8      <dynamicField name="rand*" type="random" indexed="true" stored="false"/>  
 9      ...  
10     </fields>  

由用戶請求的時候按照一個動態字段排序,sort=rand_123456*相似,隨機的生成,跟該動態字段有關 dom

Examples of queries:ui

同一個url 返回的結果會是相同url

 該字段實現自定義的一個比較器, 隨機性跟傳進來的動態字段名有關:主要的hash算法實現以下:spa

    private static int getSeed(String fieldName, AtomicReaderContext context) {  
        final DirectoryReader top = (DirectoryReader) ReaderUtil.getTopLevelContext(context).reader();  
        return fieldName.hashCode() + context.docBase + (int)top.getVersion();  
      }  

 

    private static int hash(int key) {  
      key = ~key + (key << 15); // key = (key << 15) - key - 1;  
      key = key ^ (key >>> 12);  
      key = key + (key << 2);  
      key = key ^ (key >>> 4);  
      key = key * 2057; // key = (key + (key << 3)) + (key << 11);  
      key = key ^ (key >>> 16);  
      return key >>> 1;   
    }  
相關文章
相關標籤/搜索