2017-06-05 77 views
2

我使用symfony和sonata管理项目, 我的项目将使用两种语言:fr和de,因此我使用弹性搜索,因此我安装了“friendsofsymfony/elastica-bundle”:“3.2.1 ”。弹性配置文件中的 如何添加语言配置? 这是我的FOS弹性束配置文件:弹性搜索语言配置

fos_elastica: 
    clients: 
     default: { host: %elastic_host%, port: %elastic_port% } 
    indexes: 
     myproject: 
      settings: 
       index: 
        analysis: 
         analyzer: 
          custom_analyzer : 
           type  : custom 
           tokenizer: nGram 
           filter : [stopwords, asciifolding ,lowercase, elision, worddelimiter] 
          custom_search_analyzer : 
           type  : custom 
           tokenizer: standard 
           filter : [stopwords, asciifolding ,lowercase, elision, worddelimiter] 
         tokenizer: 
          nGram: 
           type:  nGram 
           min_gram: 3 
           max_gram: 20 
         filter: 
          elision: 
           type:  elision 
           articles: [l, m, t, qu, n, s, j, d] 
          stopwords: 
           type:  stop 
           stopwords: [_french_] 
           ignore_case : true 
          worddelimiter: 
           type:  word_delimiter 

      types: 
       produit: 
        mappings: 
         titre: ~ 
         active: 
          type: boolean 
         descriptifTexteOriginal: 
          index_analyzer: custom_analyzer 
          search_analyzer : custom_search_analyzer 
          type: string 
          norms: { enabled: false } 
          explain: true 
          index_options: freqs 

        persistence: 
         driver: orm 
         model: myproject\BOBundle\Entity\Produit 
         finder: ~ 
         provider: ~ 
         listener: ~ 
+0

如何添加语言支持?例如,你可以分开你的索引,或者你可以分开你想要翻译的领域。 – hkulekci

+0

请提供一些关于您的数据结构和您的意见的额外信息? – hkulekci

+0

对不起,我不喜欢你的意思与数据结构 –

回答

1

在基地,我们将约两situtaion。第一个是你有一个领域,它可以存储 两个或更多不同的语言文本。例如,你有一个标题字段,它可以存储英语或土耳其语 。不是两个人都在同一时间。第二种情况 是,你的数据在一个文件中有多个语言值。

在我看来,这个问题也有两种方式。首先是分开你的领域 第二是分离指数。让他们都向你解释:

想想你对电子商务网站为您的产品的以下数据:

id => identify of your data 
name => name of the product 
price => price of the product 

我们的第一个意见有多个选项。现在,让我们来看看我们的第一 意见的第一选择,并创建一个映射:

PUT 44369578 
{ 
    "mappings": { 
    "product": { 
     "properties": { 
     "id": { "type": "integer" }, 
     "name": { 
      "type": "text", 
      "fields": { 
      "en": { 
       "type": "text", 
       "analyzer": "englishAnalyzer" 
      }, 
      "tr": { 
       "type": "text", 
       "analyzer": "turkishAnalyzer" 
      } 
      } 
     }, 
     "price": { "type": "double"} 
     } 
    } 
    } 
} 

有一个名称字段可以采取英文或土耳其值 而在这个领域只能处理其中之一。不是他们两个 当您尝试改善语言支持时,您也应该更改您的映射。

然后,让我们看看我们的第一个意见的第二个选项。

PUT 44369578 
{ 
    "mappings": { 
    "product": { 
     "properties": { 
     "id": { "type": "integer" }, 
     "name_en": {"type": "text", "analyzer": "englishAnalyzer" }, 
     "name_tr": {"type": "text", "analyzer": "turkishAnalyzer" }, 
     "price": { "type": "double"} 
     } 
    } 
    } 
} 

在这个例子中,我们的两种语言有两个字段。我们可以 同时为我们的文档保存英语和土耳其语价值。 当您尝试改善语言支持时,也应该更改您的映射。 这是第一种意见的两种选择。

现在,让我们看看我们的第二意见。在这个例子中,我们对 产品文档有相同的数据结构。但是我们为每种语言创建了多个索引。

PUT 44369578 
{ 
    "mappings": { 
    "product": { 
     "properties": { 
     "id": { "type": "integer" }, 
     "name": {"type": "text", "analyzer": "englishAnalyzer" }, 
     "price": { "type": "double"} 
     } 
    } 
    } 
} 

PUT 44369578 
{ 
    "mappings": { 
    "product": { 
     "properties": { 
     "id": { "type": "integer" }, 
     "name": {"type": "text", "analyzer": "turkishAnalyzer" }, 
     "price": { "type": "double"} 
     } 
    } 
    } 
} 

在这个意见,我们对每个文档两个文档,我们尝试合并 文件在我们的应用程序,同时我们正在寻找的文件。这是 这个意见的奇怪部分。但是我们可以在创建新的语言支持的同时创建新的索引。

结论,据我所知,这三种方法。你可以选择其中的一个,并且不要忘记,每次选举都会得到一些功能,但是会带走一些功能。