2013-05-08 2 views
2

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

$elasticaIndex = $elasticaClient->getIndex('users'); 
    // Create the index new 
    $elasticaIndex->create(
      array(
     'analysis' => array(
      'analyzer' => array(
       'indexAnalyzer' => array(
        'type' => 'custom', 
        'tokenizer' => 'standard', 
        'filter' => array('lowercase', 'lb_ngram') 
       ), 
       'searchAnalyzer' => array(
        'type' => 'custom', 
        'tokenizer' => 'standard', 
        'filter' => array('standard', 'lowercase', 'lb_ngram') 
       ) 
      ), 
      'filter' => array(
       'lb_ngram' => array(
        "max_gram" => 10, 
        "min_gram" => 1, 
        "type" => "nGram" 
       ) 
      ) 
     ) 
      ), true 
    ); 
    //Create a type 
    $elasticaType = $elasticaIndex->getType('profile'); 


    // Set mapping 
    $mapping->setProperties(array(
     //'id' => array('type' => 'integer', 'include_in_all' => FALSE), 
     'firstName' => array('type' => 'string', 'include_in_all' => TRUE), 
     'lastName' => array('type' => 'string', 'include_in_all' => TRUE), 
     'username' => array('type' => 'string', 'include_in_all' => TRUE), 
     'bio' => array('type' => 'string', 'include_in_all' => TRUE), 
     'thumbnail' => array('type' => 'string', 'include_in_all' => FALSE), 
     'location' => array('type' => 'string', 'include_in_all' => TRUE), 
    )); 

..... Тогда искать, я следующий

 $elasticaQueryString = new Elastica\Query\QueryString(); 

     //'And' or 'Or' default : 'Or' 
     $elasticaQueryString->setDefaultOperator('AND'); 
     $elasticaQueryString->setQuery($term); 

     // Create the actual search object with some data. 
     $elasticaQuery = new Elastica\Query(); 
     $elasticaQuery->setQuery($elasticaQueryString); 

Чтобы добавить фильтр

  $elasticaFilterLocation = new \Elastica\Filter\Term(); 
      //search 'location' = $region; 
      $elasticaFilterLocation->setTerm('location', $region);   
      $elasticaQuery->setFilter($elasticaFilterLocation); 
      $elasticaResultSet = $elasticaIndex->search($elasticaQuery);     
      $elasticaResults = $elasticaResultSet->getResults(); 

Если я прокомментирую фильтр, я получу ожидаемые результаты. Что мне не хватает? Это связано с анализатором или картографированием?

ответ

2

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

lc_analyzer' => array(
    'type' => 'custom', 
    'tokenizer' => 'keyword', 
    'filter' => array('lowercase') 
), 

Для отображения:

'location' => array('type' => 'string', 'analyzer' => 'lc_analyzer'), 

Затем запрос как

$elasticaFilterBool = new \Elastica\Filter\Bool();     
$filter1 = new \Elastica\Filter\Term(); 
$filter1->setTerm('location', array(strtolower($region)));     
$elasticaFilterBool->addMust($filter1); 
$elasticaQuery->setFilter($elasticaFilterBool); 

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

+0

Можете ли вы предоставить более подробную информацию? Например, как вы сменили свой анализатор и на что вы его изменили? – landland

+0

Я использовал 2 пользовательских анализатора 1 для электронной почты, токенизатор: uax_url_email, а другой для слов (например, случай вашего местоположения), токенизатор: стандартный, делал некоторые вещи по пробной версии и ошибкам, так как документации не много ... Скажите, если вам нужна помощь – CodeBird

+0

да, пожалуйста, помогите. Я вращаю свои колеса здесь, становясь нигде. Документация очень скудная. Я попытался использовать токенизатор: стандартный для местоположения и перестроил мой индекс, но он все равно возвращает пустое. – landland