2015-01-24 3 views
1

Я использую ElasticSearch вместе с Symfony2 и FOSElasticaBundle. Затем я пытаюсь найти что-либо только с символами ASCII, это работает как шарм. Кроме того, я использую массив JSON для данных, и он преобразует символы Unicode в нечто вроде \ u00f8C. Может ли это повлиять на мою проблему? Мой код для поиска:ElasticSearch не найден по символам UTF8

function __construct(Request $request, TransformedFinder $artist_finder, TransformedFinder $picture_finder, Router $router) 
{ 
    $this->request = $request; 
    $this->a_finder = $artist_finder; 
    $this->p_finder = $picture_finder; 
    $this->router = $router; 
} 

/** 
* @param $query 
* @return array 
*/ 
public function search($query) 
{ 
    $locale = $this->request->getLocale(); 

    $artist_results = $this->a_finder->find($query.'*', self::SEARCH_LIMIT); 
    $gallery_results = $this->p_finder->find($query.'*', self::SEARCH_LIMIT); 

    $results = array(
     'artist' => array(), 
     'gallery' => array() 
    ); 

    foreach($artist_results as $a) 
    { 
     $results['artist'][] = array(
      'url' => $this->router->generate('artist_page', ['slug' => $a->getSlug()]), 
      'name' => $a->getInfo()[$locale]['name']. ' ' .$a->getInfo()[$locale]['surname'] 
     ); 
    } 

    foreach($gallery_results as $a) 
    { 
     $results['gallery'][] = array(
      'url' => $this->router->generate('picture_page', ['slug' => $a->getSlug()]), 
      'name' => $a->getInfo()[$locale]['title'] 
     ); 
    } 

    return $results; 
} 

Кроме того, не ES обладают способностью не видеть разницы между литовскими символов, например, «S» и «S», «Е» и «E» и т.д.? Я имею в виду, я хотел бы получить такие же результаты с запросом, как «žąsis» и «zasis».

ответ

2

Мне удалось заставить его работать. Мне пришлось использовать второй параметр json_encode JSON_UNESCAPED_UNICODE для индексированных значений, ведь я думаю, имеет смысл.

1

Вам нужен https://github.com/elasticsearch/elasticsearch-analysis-icu плагин и некоторая конфигурация для фильтров (в моем случае для чешского языка) ... например.

settings: 
    analysis: 
     analyzer: 
     cs_collation: 
      type: custom 
      tokenizer: keyword 
      filter: [trim,cs_icu_collation] 
     cs_facets: 
      type: custom 
      tokenizer: keyword 
      filter: [trim] 
     custom_analyzer_cs: 
      type  : custom 
      tokenizer: nGram 
      filter : [stopwords, lowercase, czech_stemmer, asciifolding, snowball, worddelimiter] 


filter: 
    czech_stemmer: 
     type: stemmer 
     name: czech 
    cs_icu_collation: 
     type: icu_collation 
     stopwords: [_czech_] 
     language: cs 
+0

Спасибо, наконец, мне удалось заставить его работать. Мне пришлось использовать второй параметр json_encode JSON_UNESCAPED_UNICODE для индексированных значений, ведь я думаю, имеет смысл. –

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