2016-01-19 3 views
0

В таком случае я должен искать строку, разделенную запятой, с полями, разделенными запятой, из-за этого я делаю следующее при сопоставлении, но показываю ошибку MapperParsingException[Analyzer [comma] not found for field [conduct_days]].ElasticSearch как искать разделенные запятыми строки внутри разделенных запятыми полей?

  $course = new Course(); 
      $course->no = '1231321'; 
      ....... 
      ....... 
      $course->save(); 

      // Now index the new created course 

      $client = \Elasticsearch\ClientBuilder::create()->build(); 




      $params = [ 
       'index' => 'my_index', 
       'type' => 'my_resources', 
       'body' => [ 
        'my_resources' => [ 
         '_source' => [ 
          'enabled' => true 
         ], 
         'settings' => [ 
          "analysis" => [ 
           "tokenizer" => [ 
            "comma" => [ 
             "type" => "pattern", 
             "pattern" => "," 
            ] 
           ], 
           "analyzer" => [ 
            "comma" => [ 
             "type" => "custom", 
             "tokenizer" => "comma" 
            ] 
           ] 
          ] 
         ], 
         'properties' => [ 
          'conduct_days' => array(
           'type' => 'string', 
           'analyzer' => 'comma' 
          ), 
          'no' => array(
           'type' => 'string', 
           'analyzer' => 'standard' 
          ), 
          'created_at' => array(
           'type' => 'date_time', 
           "format"=>"YYYY-MM-dd HH:mm:ss||MM/dd/yyyy||yyyy/MM/dd" 
          ), 
          'updated_at' => array(
           'type' => 'date_time', 
           "format" => "YYYY-MM-dd HH:mm:ss||MM/dd/yyyy||yyyy/MM/dd" 
          ), 
          'deleted_at' => array(
           'type' => 'date_time', 
           "format" => "YYYY-MM-dd HH:mm:ss||MM/dd/yyyy||yyyy/MM/dd" 
          ), 
          'created_by' => array(
           'type' => 'string', 
           'analyzer' => 'standard' 
          ), 
          'updated_by' => array(
           'type' => 'string', 
           'analyzer' => 'standard' 
          ), 
          'deleted_by' => array(
           'type' => 'string', 
           'analyzer' => 'standard' 
          ) 
         ] 
        ] 
       ] 
      ]; 

      // Update the index mapping 
      $client->indices()->putMapping($params); 

      $params = [ 
       'index' => 'promote_kmp', 
       'type' => 'courses', 
       'id' => uniqid(), 
       'body' => [ 
        'id'      => $course->id, 
        'conduct_days'   => $course->conduct_days, 
        'no'      => $course->no, 
        'created_at'    => $course->created_at, 
        'created_by'    => $loggedInUser, 
       ] 
      ]; 
      $client->index($params); 

Предположим, что я должен искать 1,3,5,7 внутри проводить дни полей, которые могут имеет 1,2 и 1,2,3 и 1,3,5,6 и многое другое. Для поиска я думаю, что я должен взорвать поисковый запрос, например, если поисковый запрос 1,2, я должен искать два раза, сначала для 1, а затем для 2. Любое другое решение для поиска?

ответ

1

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

$params = [ 
     'index' => 'my_index', 
     'body' => [ 
        'settings' => [ 
         "analysis" => [ 
          "tokenizer" => [ 
           "comma" => [ 
            "type" => "pattern", 
            "pattern" => "," 
           ] 
          ], 
          "analyzer" => [ 
           "comma" => [ 
            "type" => "custom", 
            "tokenizer" => "comma" 
           ] 
          ] 
         ] 
        ] 
     ] 
    ]; 

    $response = $client->indices()->create($params); 

Тогда вы можете вызвать putMapping с определением типа отображения, но без settings:

 $params = [ 
      'index' => 'my_index', 
      'type' => 'my_resources', 
      'body' => [ 
       'my_resources' => [ 
        '_source' => [ 
         'enabled' => true 
        ], 
        'properties' => [ 
         'conduct_days' => array(
          'type' => 'string', 
          'analyzer' => 'comma' 
         ), 
         'no' => array(
          'type' => 'string', 
          'analyzer' => 'standard' 
         ), 
         'created_at' => array(
          'type' => 'date_time', 
          "format"=>"YYYY-MM-dd HH:mm:ss||MM/dd/yyyy||yyyy/MM/dd" 
         ), 
         'updated_at' => array(
          'type' => 'date_time', 
          "format" => "YYYY-MM-dd HH:mm:ss||MM/dd/yyyy||yyyy/MM/dd" 
         ), 
         'deleted_at' => array(
          'type' => 'date_time', 
          "format" => "YYYY-MM-dd HH:mm:ss||MM/dd/yyyy||yyyy/MM/dd" 
         ), 
         'created_by' => array(
          'type' => 'string', 
          'analyzer' => 'standard' 
         ), 
         'updated_by' => array(
          'type' => 'string', 
          'analyzer' => 'standard' 
         ), 
         'deleted_by' => array(
          'type' => 'string', 
          'analyzer' => 'standard' 
         ) 
        ] 
       ] 
      ] 
     ]; 

     // Update the index mapping 
     $client->indices()->putMapping($params); 

UPDATE

Однако , в вашем случае я считаю, что лучше всего создать index template, который содержит настройки (например, анализаторы) и отображения. Тогда все ваше приложение должно заботиться о просто позвонить index(), чтобы индексировать новые документы курса. ES позаботится о создании индекса и сопоставления в нужное время, т. Е. При первом указании вашего первого документа курса.

Обратите внимание, что для того, чтобы сделать это, вам нужно

  1. удалить текущий индекс и indices->create() и indices->putMapping() вызовов в вашем коде
  2. создать шаблон индекса с помощью/головами/плагиным или Sense или просто завиток
  3. только позвонить index() из вашего кода
+0

Но поскольку я должен создать картографирования много раз, например, внутри создать действие, обновление и удалить, как мне создать индекс, который должен был создать один раз. На данный момент я меняю свой код, как тот, который вы указали, показывает эту ошибку. 'IndexAlreadyExistsException [[promotion_kmp] уже существует]'. – jones

+0

Обычно вы создаете индекс и тип отображения, а затем вам больше не нужно. Вы можете удалить индекс перед его созданием с помощью '$ response = $ client-> index() -> delete (['index' => 'promotion_kmp']);'. Затем вы можете снова вызвать 'create'. – Val

+0

Но, удалив индекс, безопасны ли данные? Я думаю, что потеряю индексированные документы. – jones

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