2014-09-25 33 views
0

我有一個字段,說F,我通過使用KeywordTokenizer,小寫過濾器和TrimFilter保持未分析..Lucene TermQuery vs PhraseQuery:此過濾器查詢包含術語查詢或詞組查詢嗎?

當我爲F啓用過濾器查詢時,過濾器查詢被解析爲TermQuery而不是PhraseQuery ..

這裏是我的篩選查詢 -

filter=F:"A B C" 

這裏是我所嘗試的代碼 -

String fqs [] = msParams.getParams("fq");//msParams is ModifiableSolrParams 
if(fqs != null) { 
    for(int i=0; i<fqs.length; i++) { 
    try { 
     String field = null; 
     QParser fqp = QParser.getParser(fqs[i], null, req);//req is request 
     if(fqp.getQuery() instanceof TermQuery) { 
     TermQuery fq = (TermQuery) fqp.getQuery(); 
     field = fq.getTerm().field(); 

我的問題是 - 爲什麼像F:"A B C"這樣的查詢被解析爲solr作爲TermQuery而不是PhraseQuery?

+1

這看起來像Solr的問題不是一個Lucene一個更....莫非你共享查詢解析器,因爲它是在confix.xml中配置的? – 2014-09-25 12:46:09

回答

0

探索代碼後發現,發生了什麼事 -

的令牌數量爲1(這是我堂妹KeywordTokenizer的情況下),上述查詢被解析爲TermQuery另有超過1個令牌,它尋找布爾查詢或短語查詢..

源文件 - SolrQueryParserBase.java線461(Solr的 - 4.5.0)

if (numTokens == 0) 
     return null; 
    else if (numTokens == 1) { 
     try { 
     boolean hasNext = buffer.incrementToken(); 
     assert hasNext == true; 
     termAtt.fillBytesRef(); 
     } catch (IOException e) { 
     // safe to ignore, because we know the number of tokens 
     } 
     return newTermQuery(new Term(field, BytesRef.deepCopyOf(bytes))); 
    } else { 
     if (severalTokensAtSamePosition || (!quoted && !autoGeneratePhraseQueries)) { 
     if (positionCount == 1 || (!quoted && !autoGeneratePhraseQueries)) { 
      // no phrase query: 
      BooleanQuery q = newBooleanQuery(positionCount == 1); 

      BooleanClause.Occur occur = positionCount > 1 && operator == AND_OPERATOR ? 
      BooleanClause.Occur.MUST : BooleanClause.Occur.SHOULD; 

      for (int i = 0; i < numTokens; i++) { 
      try { 
       boolean hasNext = buffer.incrementToken(); 
       assert hasNext == true; 
       termAtt.fillBytesRef(); 
      } catch (IOException e) { 
       // safe to ignore, because we know the number of tokens 
      } 
      Query currentQuery = newTermQuery(
       new Term(field, BytesRef.deepCopyOf(bytes))); 
      q.add(currentQuery, occur); 
      } 
      return q; 
     } 
     else { 
      // phrase query: 
      MultiPhraseQuery mpq = newMultiPhraseQuery(); 
      mpq.setSlop(phraseSlop); 
      List<Term> multiTerms = new ArrayList<Term>(); 
      int position = -1; 
      for (int i = 0; i < numTokens; i++) { 
      int positionIncrement = 1; 
      try {