2015-07-16 2 views
1

Я новичок в elasticsearch, однако мне грозит трудность, так как мои запросы не меняют моих результатов при изменении типов и фильтров!Эластичный поиск найти точную строку PHP

Я работаю с MongoDB PHP, и вот мой код:

$test2 = [ 
     "filtered" => [ 
      "query" => [ 
       "match_phrase" => [ 
        "product_name" => [ 
     "query" => "Brown Fox", 
    ] 
       ] 
      ] 
     ] 
    ]; 
$testResult = $client_es->search(
       array(
        'index' =>'myindex', 
        'type' => 'mytype', 
        'body' => array(
         'query' => $test2, 
         'size' => 5000, 
        ), 
       ) 
      ); 


     $testR = $testResult["hits"]["hits"]; 
     $total = $testResult["hits"]["total"]; 
     echo "TOTAL: ". $total ."<br>"; 

     foreach ($testR as $key) { 
      echo $key["_source"]["product_name"]; 
      echo "<br>"; 


     } 

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

UPDATE 1:

curl -XPUT "www.domain.com/my_index/my_mapping/my_type" -d '{ 
     "my_type" : { 
      "properties": { 
       "product_name": { 
        "type": "string", 
        "index": "not_analyzed" 
       } 
      } 
     } 
}'; echo 
+0

Я не уверен, если РНР имеет конкретную реализацию ES, которая требует дополнительного или иной синтаксис (как NEST для C#), но если вы ищете точное совпадение, в этом случае я бы предложил фильтр терминов по отфильтрованному запросу с matchAll. –

ответ

0

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

{ 
    "product": { 
     "properties": { 
      "id": { 
       "type": "integer" 
      }, 
      "name": { 
       "type": "string" 
      } 
     } 
    } 
} 

вместо

{ 
    "product": { 
     "properties": { 
      "id": { 
       "type": "integer" 
      }, 
      "name": { 
       "type": "string", 
       "index": "not_analyzed" 
      } 
     } 
    } 
} 

Это приведет к тому, что поле name будет проиндексировано с помощью анализатора по умолчанию (заставляя каждое проиндексированное слово).

См

+0

Когда я добавил это SSH, он говорит 'признал = true', но я не могу это использовать. – developer

+0

Что значит «я не могу использовать это»? – Tobi

+0

Когда я добавляю свой индекс и мой тип в поисковый запрос, как указано в моем коде выше, я не смог найти никаких результатов. – developer

0

вы можете использовать этот

<?php 
$search_host = '127.0.0.1'; 
$search_port = '9200'; 
$index = 'myindex'; 
$doc_type = 'tweecoms'; 
$query = '_search'; 
ini_set('memory_limit', '5500000M'); 
set_time_limit(10000); 
echo date('j m y h:i:s') . '<br>'; 
    $json_doc = 
       '{ 
        "query": { 
        "query_string": { 
         "query": "*life*", 
         "lenient": true 
        } 
        }, 
        "size": 1000, 
        "from": 0, 
        "fields": [ 
        "association_key" 
        ] 
       }'; 
    //$json_doc = json_encode($json_doc); 
    $baseUri = 'http://' . $search_host . ':' . $search_port . '/' . $index . '/' . $doc_type . '/' . $query; 
    $ci = curl_init(); 
    curl_setopt($ci, CURLOPT_URL, $baseUri); 
    curl_setopt($ci, CURLOPT_PORT, $search_port); 
    curl_setopt($ci, CURLOPT_TIMEOUT, 200); 
    curl_setopt($ci, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ci, CURLOPT_FORBID_REUSE, 0); 
    curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'GET'); 
    curl_setopt($ci, CURLOPT_POSTFIELDS, $json_doc); 
    $response = curl_exec($ci); 
    curl_close($ci); 
    print_r($response); 
    echo '<br>'.date('j m y h:i:s') . '<br>'; 
Смежные вопросы