2017-02-01 110 views
1

我使用Elasticsearch 2.4.3在我的春節,啓動應用程序和使用下面的查詢Elasticsearch的Java API - 布爾查詢操作

QueryBuilder qb = new BoolQueryBuilder() 
     .must(QueryBuilders.multiMatchQuery(term, "phoneticFirstName", "phoneticLastName", "phoneticLocationName", "phoneticCompanyName") 
       .analyzer("atsCustomSearchAnalyzer") 
       .operator(Operator.AND)) 
     .must(QueryBuilders.multiMatchQuery(term, "ngramFirstName^3", "ngramLastName^3", "ngramLocationName^3", "ngramCompanyName^3", "_all") 
       .analyzer("atsCustomSearchAnalyzer") 
       .operator(Operator.AND)); 

我想要得到的響應,其中,第一查詢或第二查詢獲得的點擊....你能幫我在我的守則中改變嗎?

UPDATE

 "atsCustomPhoneticAnalyzer":{ 
      "type":"custom", 
      "tokenizer":"whitespace", 
      "filter":["lowercase","asciifolding","atsPhoneticFilter"] 
     }, 
     "atsCustomSearchAnalyzer":{ 
      "type":"custom", 
      "tokenizer":"whitespace", 
      "filter":["lowercase","asciifolding","umlautStemmer","germanStemmer"] 
     } 

更新#2

QueryBuilder qb = new BoolQueryBuilder() 
     .should(QueryBuilders.multiMatchQuery(term, "ngramFirstName", "ngramLastName", "ngramLocationName", "ngramCompanyName") 
      .type(Type.CROSS_FIELDS) 
      .analyzer("atsCustomSearchAnalyzer") 
      .operator(Operator.AND) 
      .boost(3)) 
     .should(QueryBuilders.multiMatchQuery(term, "phoneticLastName") 
      .analyzer("atsCustomPhoneticAnalyzer") 
      .operator(Operator.AND)) 
     .should(QueryBuilders.matchQuery(term, "_all") 
       .analyzer("atsCustomSearchAnalyzer") 
       .operator(Operator.AND)) 
     .minimumNumberShouldMatch(1); 

我有2個指標:人員和活動。當我註釋掉第二個查詢時,我會從人員和活動中獲得點擊。如果所有3個查詢都存在,活動中的點擊不再存在......

任何想法?

+1

變化'must'與'should'代替,並添加'minimumShouldMatch(1)' – Val

+0

謝謝瓦爾,它的作品!但我的Koelnerphonetic查詢將無法正常工作:(它處理諸如「邁爾/邁爾/梅爾/邁爾」這樣的事情,並說這些是聽起來一樣...在我的問題,我已經更新了我的映射/設置 –

+0

好吧, nvm .....我剛剛在第一個查詢中使用了錯誤的分析儀 –

回答

2

簡單地改變mustshould代替,並添加minimumShouldMatch(1)

QueryBuilder qb = new BoolQueryBuilder() 
    .minimumNumberShouldMatch(1) 
    .should(QueryBuilders.multiMatchQuery(term, "phoneticFirstName", "phoneticLastName", "phoneticLocationName", "phoneticCompanyName") 
      .analyzer("atsCustomSearchAnalyzer") 
      .operator(Operator.AND)) 
    .should(QueryBuilders.multiMatchQuery(term, "ngramFirstName^3", "ngramLastName^3", "ngramLocationName^3", "ngramCompanyName^3", "_all") 
      .analyzer("atsCustomSearchAnalyzer") 
      .operator(Operator.AND)); 
+0

感謝這個例子 - 它的工作!但現在我有另一個問題(請參閱問題更新#2) –

+0

您需要使用正確的分析儀,你已定義'atsCustomPhoneticAnalyzer',但您引用'atsCustomSearchAnalyzer' – Val

+0

已將我的CustomSearchAnalyzer添加到我在問題區域中的映射示例 –