Как получить точное совпадение текста изasticsearch, если запрос находится в кавычках - PullRequest
1 голос
/ 06 ноября 2019

Я реализовалasticsearch, используя php для двоичных документов (fscrawler). Он работает просто отлично с настройками по умолчанию. Я могу искать в документах нужное мне слово и получать результаты без учета регистра. Однако теперь я хочу делать точные совпадения, то есть поверх текущего поиска, если запрос заключен в кавычки, я хочу получить результаты, которые точно соответствуют запросу ... даже с учетом регистра.

Мое сопоставление выглядит следующим образом:

"settings": {
"number_of_shards": 1,
"index.mapping.total_fields.limit": 2000,
"analysis": {
  "analyzer": {
    "fscrawler_path": {
      "tokenizer": "fscrawler_path"
    }
  },
  "tokenizer": {
    "fscrawler_path": {
      "type": "path_hierarchy"
    }
  }
}
.
.
.
  "content": {
    "type": "text",
    "index": true
  },

Мой запрос документов выглядит следующим образом:

    if ($q2 == '') {
    $params = [
        'index' => 'trial2',
        'body' => [
            'query' => [
                'match_phrase' => [
                        'content' => $q
                ]
            ]
        ]
    ];

    $query = $client->search($params);
    $data['q'] = $q;
}

Для точных совпадений (не работает):

    if ($q2 == '') {
        $params = [
            'index' => 'trial2',
            'body' => [
                'query' => [
                    'filter' =>[
                        'term' => [
                            'content' => $q
                        ]
                    ]
                ]
            ]
        ];

        $query = $client->search($params);
        $data['q'] = $q;
    }

Поле содержимого - это тело документа. Как реализовать точное совпадение для конкретного слова или фразы в поле содержимого?

1 Ответ

1 голос
/ 07 ноября 2019

Ваше поле content, насколько я понимаю, будет значительно большим, поскольку многие документы могут занимать более 2-3 МБ, и это много слов.

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

Я понимаю, что поле content, которое выесть неструктурированный. В этом случае вы захотите использовать Whitespace Analyzer в своем поле content.

Также для точного соответствия фразы вы можете взглянуть на Match Phrase query.

Ниже приведен пример индекса, документов и запросов, которые будут соответствовать вашему варианту использования.

Отображение:

PUT mycontent_index
{
  "mappings": {
    "properties": {
      "content":{
        "type":"text",
        "analyzer": "whitespace"            <----- Note this
      }
    }
  }
}

Образцы документов:

POST mycontent_index/_doc/1
{
  "content": """
      There is no pain you are receding
      A distant ship smoke on the horizon
      You are only coming through in waves
      Your lips move but I can't hear what you're saying
  """
}

POST mycontent_index/_doc/2
{
  "content": """          
      there is no pain you are receding
      a distant ship smoke on the horizon
      you are only coming through in waves
      your lips move but I can't hear what you're saying
  """
}

Фразовое соответствие: (Для поиска предложения со словами по порядку)

POST mycontent_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match_phrase": {                   <---- Note this for phrase match
            "content": "There is no pain"
          }
        }
      ]
    }
  }
}

Match Query:

POST mycontent_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {                          <---- Use this for token based search
            "content": "there"
          }
        }
      ]
    }
  }
}

Обратите внимание, что ваш ответ должен быть соответствующим.

Для точного соответствия слова просто используйте простой запрос Match .

Обратите внимание, что когда вы не указываете какой-либо анализатор, ES по умолчанию использует Standard Analyzer , и это приведет к преобразованию всех токенов в нижний регистр перед сохранением их в Inverted Index. Однако Whitespace Analyzer не будет преобразовывать токены в нижний регистр. В результате There и there сохраняются как два разных токена в вашем индексе ES.

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

Обновленный ответ:

Публикуя понимание ваших требований, вы не сможете применить несколько анализаторов к одному полю, поэтому в основном у вас есть два варианта:

Вариант 1: Использование нескольких индексов

Вариант 2: Использование мультиполя в отображении, как показано ниже:

Таким образом,ваш сценарий или сервисный слой будут иметь логику нажатия на разные индексы или поля в зависимости от вашего входного значения (те, которые имеют двойную инвертированную запятую, и те, которые являются простыми токенами)

Отображение нескольких полей:

PUT <your_index_name>
{ 
   "mappings":{ 
      "properties":{ 
         "content":{ 
            "type":"text",                     <--- Field with standard analyzer
            "fields":{ 
               "whitespace":{ 
                  "type":"text",               <--- Field with whitespace
                  "analyzer":"whitespace"       
               }
            }
         }
      }
   }
}

В идеале, я бы предпочел иметь первое решение, то есть использовать несколько индексов с различным отображением, однако я бы настоятельно рекомендовал вам вернуться к своему варианту использования, потому что не имеет смысла управлять такими запросами, но снова еговаш звонок.

Примечание: Кластер с одним узлом - это наихудший вариант, который вы когда-либо можете сделать, особенно для Production.

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

Надеюсь, это поможет.

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