ElasticSearch: (ИЛИ) подстановочный знак на двух полях И соответствует ровно одному - PullRequest
0 голосов
/ 20 сентября 2018

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

Сценарий.У меня есть следующие (client тип) документы в индексе clients (не волнуйтесь: имена футболистов, а номера телефонов не настоящие):

    {
      "firstName" : "Alessandro",
      "lastName" : "Nesta",
      "phoneNumber" : "+3949304903",
      "merchantId" : "90339203812831293"
    },
    {
      "firstName" : "Alessandro",
      "lastName" : "Del Piero",
      "phoneNumber" : "+39129302902",
      "merchantId" : "90339203812831293"
    },
    {
      "firstName" : "Alessandro",
      "lastName" : "Costacurta",
      "phoneNumber" : "+39098921321",
      "merchantId" : "1239021392839238"
    }

Теперь поискзапрос, который я ищу, в основном делает это: учитывая merchantId и строку запроса, попробуйте найти строку запроса внутри firstName или внутри lastName, но убедитесь, что merchantId точно такой же, как тот, который был передан в запросе.

Допустим, у меня есть строка запроса "Aless" и merchantId "90339203812831293", в мире SQL, который я собирался сделать:

SELECT
*
FROM
  `clients`
WHERE
  `merchantId` = "90339203812831293"
AND 
(
  `firstName` LIKE "Aless%" OR `lastName` LIKE "Aless%"
);

И результаты должны быть:

{
  "firstName" : "Alessandro",
  "lastName" : "Nesta",
  "phoneNumber" : "+3949304903",
  "merchantId" : "90339203812831293"
},
{
  "firstName" : "Alessandro",
  "lastName" : "Del Piero",
  "phoneNumber" : "+39129302902",
  "merchantId" : "90339203812831293"
}

Что я пробовал?В основном отличается от комбинаций, от размещения merchantId в разделе фильтра, до multi_match.

{
"query": {
  "bool": {
    "should": [
      {
        "wildcard": {
          "firstName": "aless*"
        }
      },
      {
        "wildcard": {
          "lastName": "aless*"
        }
      }
    ],
    "must": {
      "match": {
        "merchantId": "90339203812831293"
      }
    }
  }
}

0 результатов (если я удаляю часть merchantId, то работает нормально).

Я пробовал с запросомСтроки тоже:

{
"query": {
  "bool": {
    "must": {
      "query_string": {
        "query": "Del*",
        "fields": [
          "firstName",
          "lastName"
        ]
      }
    },
    "filter": {
      "term": {
        "merchantId": "90339203812831293"
      }
    }
  }
}
}

Та же проблема.Не могли бы вы мне указать, что я делаю неправильно?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вы пробовали использовать несколько совпадений?

{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "Aless",
            "fields": ["firstName", "lastName"]
         }
        },
        {
          "match": {
            "merchant_id": "90339203812831293"
          }
        }
      ]
    }
  }
}

или

{
  "query": {
    "bool": {
      "must": 
            {
              "multi_match": {
                "query": "Aless",
                "fields": ["firstname", "lastname"]
          }
        },
        "filter": {
          "term": {
            "merchant_id": "90339203812831293"
          }
        }
    }
  }
}
0 голосов
/ 20 сентября 2018

Это невероятно, 1 день полного разочарования, и как только я спросил здесь, я наконец-то нашел решение:

{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "Aless*",
            "fields": [
              "firstName",
              "lastName"
            ]
          }
        },
        {
          "match": {
            "merchant_id": "90339203812831293"
          }
        }
      ]
    }
  }
}

Однако я более чем открыт для новых решений, потому что я почти уверен, что этоне самый лучший.Я все еще могу изменить даже структуру документа, если это необходимо.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...