2017-02-01 5 views
1

Я использую Elasticsearch 2.4.3 в моем Spring загрузки приложения и использовать следующий запросElasticsearch Java API - Bool запросов Оператор

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"] 
     } 

UPDATE # 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 показатели: человек и деятельность. Когда я комментирую второй запрос, я получаю Hits от людей и действий. Если все 3 запроса присутствуют, хитов от деятельности больше нет.

Любые идеи?

+1

Изменение '' must' с should' вместо и добавить 'minimumShouldMatch (1)' – Val

+0

Благодаря Val, это работает! Но мой Koelnerphonetic Query не будет работать: (он обрабатывает такие вещи, как «Mayer/Maier/Meyer/Meier» и говорит, что эти звуки одинаковы ... в моем вопросе я обновил мои настройки/настройки для этого –

+0

Хорошо, nvm ..... Я просто использовал неправильный анализатор в первом запросе –

ответ

2

Просто измените must с should вместо и добавить 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 к моему примеру сопоставления в области Вопроса –

 Смежные вопросы

  • Нет связанных вопросов^_^