【问题标题】:ElasticSearch does not find by UTF8 charactersElasticSearch 找不到 UTF8 字符
【发布时间】:2015-01-24 12:43:05
【问题描述】:

我将 ElasticSearch 与 Symfony2 和 FOSElasticaBundle 一起使用。然后我尝试查找仅包含 ASCII 字符的任何内容,它就像一个魅力。另外,我使用 JSON 数组存储数据,它将 unicode 字符转换为 \u00f8C 之类的东西。这会影响我的问题吗?我的搜索代码:

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”、“Ė”和“E”等?我的意思是,我想通过“žąsis”和“zasis”之类的查询获得相同的结果。

【问题讨论】:

    标签: symfony elasticsearch foselasticabundle


    【解决方案1】:

    我已经成功了。我不得不使用第二个 json_encode 参数 JSON_UNESCAPED_UNICODE 作为索引值,我认为这是有道理的。

    【讨论】:

      【解决方案2】:

      您需要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
      

      【讨论】:

      • 谢谢,我终于成功了。我不得不使用第二个 json_encode 参数 JSON_UNESCAPED_UNICODE 作为索引值,我认为这很有意义。
      【解决方案3】:

      您必须配置analyser section of your fos_elastica bundle configuration

      根据您的需要,可以应用不同的分析器。并且有特定的语言,请查看相关的elasticsearch documentation

      【讨论】:

        猜你喜欢
        • 2018-08-25
        • 2020-10-20
        • 2021-04-18
        • 2019-03-22
        • 1970-01-01
        • 1970-01-01
        • 2017-07-07
        • 2020-02-07
        • 2020-04-24
        相关资源
        最近更新 更多