2017-02-11 4 views
0

Я просто работаю через Elastic Search и нуждаюсь в некоторой помощи с функцией автозаполнения.Эластичный поиск автозаполнения со вторичным поисковым заказом

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

Большое спасибо.

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

PUT /ff_search_locations2?pretty 
{ 
    "mappings": { 
    "1": { 
     "_all": { 
     "enabled": false 
     }, 
     "properties": { 
     "city": { 
      "type": "text" 
     }, 
     "county": { 
      "type": "text" 
     }, 
     "region": { 
      "type": "text" 
     }, 
     "country": { 
      "type": "text" 
     }, 
     "url": { 
      "type": "text" 
     }, 
     "combined": { 
      "type": "completion" 
     }, 
     "city_lc": { 
      "type": "text" 
     }, 
     "population": { 
      "type": "text" 
     }, 
     "location": { 
      "type": "geo_point" 
     } 
     } 
    } 
    } 
} 

Мой рабочий запрос:

POST /ff_search_locations2/_suggest?pretty&pretty 
{ 
    "1": { 
    "prefix": "london", 
    "completion": { 
     "field": "combined" 
    } 
    } 
} 

Что я пробовал:

POST /ff_search_locations2/_suggest?pretty&pretty 
{ 
    "1": { 
    "prefix": "london", 
    "completion": { 
     "field": "combined" 
    } 

    }, 
    "sort": { "population": { "order": "desc" }} 
} 

и возвратил ошибку:

{ 
    "error": { 
    "root_cause": [ 
     { 
     "type": "illegal_argument_exception", 
     "reason": "suggester with name [population] not supported" 
     } 
    ], 
    "type": "illegal_argument_exception", 
    "reason": "suggester with name [population] not supported" 
    }, 
    "status": 400 
} 

код PHP Я использую для создания индекса:

error_reporting(-1); 
ini_set('display_errors', 'On'); 

$db = "my_db"; 
$link = mysqli_connect("localhost", "user", "pass", "$db") or die(mysql_error()); 

$result = mysqli_query($link, "SELECT * FROM search_locations6 ORDER BY Population DESC") or die(mysql_error()); 
while($row = mysqli_fetch_array($result)) 
{ 
    $ii++; 
    $i++; 

    $data_array = array("city" => $row['city'],"county" => $row['county'],"region" => $row['region'],"country" => $row['country'],"url" => $row['url'],"combined" => $row['combined'],"city_lc" => $row['city_lc'],"population" => $row['Population'],"location" => array("lat" => $row['lat'],"lon" => $row['long'])); 

    //doing it in chunks, don't feel like changing heap sizes... etc. 
    if($i < 10000) 
    { 
     $json_data = '{"index":{"_id":"'.$ii.'"}}'; 
     $json_data .= "\n"; 
     $json_data .= json_encode($data_array); 
     $json_data .= "\n"; 
     file_put_contents('bulk.php', $json_data, FILE_APPEND); 
    } 
    else 
    { 
     exec('curl --fail --silent --show-error -XPOST \'localhost:9200/ff_search_locations2/1/_bulk?pretty&refresh\' --data-binary "@bulk.php"'); 
     unlink('bulk.php'); 
     unset($i); 
    } 
} 
+0

Ссылка Я должен был найти ранее [ссылка] (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters-completion.html) –

ответ

0

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

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

EDIT: Глядя на коде индексации, вы можете добавить weight для combined поля как population поля.

`$data_array = array("city" => $row['city'],"county" => $row['county'],"region" => $row['region'],"country" => $row['country'],"url" => $row['url'],"combined" => array("input" => $row['combined'], "weight" => $row['Population']),"city_lc" => $row['city_lc'],"population" => $row['Population'],"location" => array("lat" => $row['lat'],"lon" => $row['long']));` 
+0

Это сработало! если вы можете обновить свой ответ, чтобы сказать что-то вроде ... Добавьте свое население в качестве значения вашего веса в свой тип завершения следующим образом: 'code' $ data_array = array (" city "=> $ row ['city']," county "=> $ row ['county']," region "=> $ row ['region']," country "=> $ row ['country']," url "=> $ row ['url'], «объединенный» => массив («вход» => $ row ['объединенный'], "вес" => $ row ['Population']), "city_lc" => $ row ['city_lc'], "population" => $ row ['Population'], "location" => array ("lat" => $ row ['lat'], "lon" => $ row ['long'])); 'code' then I Пометьте это как правильный ответ. –

+0

Спасибо, что поместили код индексирования. Обновлен мой ответ. – NutcaseDeveloper

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