2011-02-23 5 views
0

나침반 인덱스의 최근 항목에 대해 쿼리 시간을 단축하려고합니다. 내 클래스 매핑에 대한 속성을 사용하여 시도했다, 그러나 이것은 쿼리 타임이 아닌 인덱스 시간 동안 부스트에만 영향을주는 것으로 보입니다.나침반에서 날짜 기반 쿼리 시간 향상을 수행 할 수 있습니까?

아이디어가 있으십니까? '날짜'당신이 향상 할 문서에 날짜 필드이고 compassBuilderQuery 당신이 나침반 쿼리 빌더로 생성 한 쿼리입니다

답변

0
  DefaultCompassQuery query = (DefaultCompassQuery) compassBuilderQuery.toQuery(); 
      query.setTypes(types.toArray(new Class[types.size()])); 
      LuceneSearchEngineQuery searchEngineQuery = (LuceneSearchEngineQuery) query.getSearchEngineQuery(); 
      final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); 
      final long timeInMillis = Calendar.getInstance().getTimeInMillis(); 
      ValueSourceQuery valSrcQuery = new ValueSourceQuery(new ValueSource() { 

       private static final long serialVersionUID = 1L; 

       @Override 
       public int hashCode() { 
        return System.identityHashCode(this); 
       } 

       @Override 
       public DocValues getValues(final IndexReader reader) throws IOException { 
        return new DocValues() { 

         @Override 
         public float floatVal(int doc) { 
          try { 
           Document document = reader.document(doc); 
           Field field = document.getField("date"); 
           if (null != field) { 
            Date parse = sdf.parse(field.stringValue()); 

            long t = timeInMillis - parse.getTime(); 

            float f = (1.0f/(t * (1.0f/TimeUnit.DAYS.toMillis(30)) + 1.0f)); 
            if (logger.isDebugEnabled()) { 
             logger.debug("Date match: " + parse.toString()); 
             logger.debug("Calculated date boost as: " + f + " for doc id: " + doc); 
            } 
            return f; 
           } 
          } catch (CorruptIndexException e) { 
           e.printStackTrace(); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } catch (ParseException e) { 
           e.printStackTrace(); 
          } 
          return 1.0f; 
         } 

         @Override 
         public String toString(int doc) { 
          return description() + "=" + strVal(doc); 
         } 

        }; 
       } 

       @Override 
       public boolean equals(Object o) { 
        return this == o; 
       } 

       @Override 
       public String description() { 
        return "[boost: date]"; 
       } 
      }); 
      CustomScoreQuery sq = new CustomScoreQuery(searchEngineQuery.getQuery(), valSrcQuery); 
      searchEngineQuery.setQuery(sq); 

. 나이를 기준으로 날짜를 줄이거 나 늘릴 수 있도록 '30'을 조정할 수도 있습니다.

관련 문제