Простой запрос 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'
)
)); */