Простой запрос AND с Elasticsearch

Я пытаюсь сделать простой запрос для двух указанных полей, а руководство и Google окажутся мало полезными. В приведенном ниже примере должно быть ясно, что я хочу делать.

{
  "query": {
      "and": {
        "term": {
          "name.family_name": "daniel",
          "name.given_name": "tyrone"
        }
      }
   }
}

Как бонусный вопрос, почему он находит "Даниэль Тайрон" с "даниэлем", но НЕ, если я ищу "Даниэля". Он ведет себя как реальный странный поиск с учетом чувствительности к регистру.

Ответ 1

Изменить: Обновлено, извините. Вам нужен отдельный объект Term для каждого поля внутри запроса Bool:

{
  "query": {
    "bool": {
        "must" : [
          {
           "term": {
             "name.family_name": "daniel"
           }
         },
         {
           "term": {
             "name.given_name": "tyrone"
           }
         }
       ]
     }
   }
}

Запросы Term не анализируются ElasticSearch, что делает их чувствительными к регистру. Запрос Term говорит ES "искать этот точный токен внутри вашего индекса, включая случай и пунктуацию".

Если вы хотите нечувствительность к регистру, вы можете добавить к вашему анализатору ключевое слово + фильтр нижнего регистра. Кроме того, вы можете использовать запрос, который анализирует ваш текст во время запроса (например, запрос Match)

Edit2: вы также можете использовать фильтры And и Bool.

Ответ 2

Я нашел решение, по крайней мере, для нескольких текстовых сравнений в одном поле:

{
  "query": {
    "match": {
      "name.given_name": {
        "query": "daniel tyrone",
        "operator": "and"
      }
    }
  }

И я нашел это для нескольких полей, это правильный путь?

{
  "query": {
    "bool": {
      "must": [        
        {
          "match": {
            "name.formatted": {
              "query": "daniel tyrone",
              "operator": "and"
            }
          }
        },
        {
          "match": {
            "display_name": "tyrone"
          }
        }
      ]
    }
  }
}

Ответ 3

При составлении json с PHP эти два примера работали на меня.

$activeFilters - это просто разделимая запятая строка, например: 'достопримечательности, limpopo'

$articles = Article::searchByQuery(array(
        'match' => array(
            'cf_categories' => array(
                'query' => $activeFilters,
                'operator' =>'and'
            )
        )
    ));

    // The below code is also working 100%
    // Using Query String https://www.elastic.co/guide/en/elasticsearch/reference/1.4/query-dsl-query-filter.html
    // https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html
    /* $articles = Article::searchByQuery(array(
        'query_string' => array(
            'query' => 'cf_categories:attractions AND cf_categories:limpopo'
        )
    )); */