ES NGram with multi-languages

时间:2016-02-04 10:29:08

标签: elasticsearch

我正在尝试实施由ES索引驱动的自动建议控件。该索引有多个字段(多语言 - 阿拉伯语和英语),我希望能够搜索所有语言。

最简单的方法是使用“_ all”字段的NGram,只要在映射定义中采取一些注意事项。我们现在遇到的问题是如何使用多语言来实现这一目标。

PS:我们希望为所有可能的语言分开字段(使用一个索引)。

我尝试使用nGram tokenizer和过滤器,它适用于一种语言(英语)。

{
    "template": "index_com",
    "settings": {
      "number_of_shards": 5,
      "number_of_replicas": 1,
      "analysis": {
         "filter": {
            "edgeNGram_filter": {
               "type": "edgeNGram",
               "min_gram": 2,
               "max_gram": 20
            }
         },
         "analyzer": {
            "edgeNGram_analyzer": {
               "type": "custom",
               "tokenizer": "whitespace",
               "filter": [
                  "lowercase",
                  "asciifolding",
                  "edgeNGram_filter"
               ]
            }
         }
      }
   },
    "mappings": {
        "product": {
            "_all": {
                "enabled": true,
                "index_analyzer": "edgeNGram_analyzer",
                "search_analyzer": "standard"
            },
            "properties": {
                "id": {
                    "type": "string",
                    "index": "no",
                    "include_in_all": false
                },
                "uuid": {
                    "type": "string",
                    "index": "no",
                    "include_in_all": false
                },
                "name": {
                    "type": "string",
                    "include_in_all": true
                },
                "description": {
                    "type": "string",
                    "include_in_all": true
                },
                "brand": {
                    "type": "string",
                    "include_in_all": true
                },    
                "made_id": {
                    "type": "string",
                    "include_in_all": true
                },        
                "category": {
                    "type": "string",
                    "include_in_all": true
                },
                "category_id": {
                    "type": "integer",
                    "include_in_all": false
                },
                "keywords": {
                    "type": "string",
                    "include_in_all": true
                },
                "colors": {
                    "type": "string",
                    "index": "not_analyzed"
                },
                "colors_name": {
                    "type": "string",
                    "include_in_all": true
                },
                "quality": {
                    "type": "string",
                    "index": "not_analyzed"
                },
                "vendor_name": {
                    "type": "string",
                    "include_in_all": false
                    },
                "vendor_location" : {
                    "type" : "geo_point",
                    "include_in_all": false
                },
                "price": {
                    "type": "double",
                    "include_in_all": false
                },
                "price_before_discount": {
                    "type": "double",
                    "include_in_all": false
                },          
                "is_deal": {
                    "type": "integer",
                    "include_in_all": false
                },
                "is_best_seller": {
                    "type": "integer",
                    "include_in_all": false
                },                    
                "views": {
                    "type": "integer",
                    "include_in_all": false
                },
                "rating": {
                    "type": "integer",
                    "include_in_all": false
                },
                "updated_at": {
                   "type": "date",
                   "format": "dateOptionalTime"
                },
                "created_at": {
                   "type": "date",
                   "format": "dateOptionalTime"
                },
                "image_link": {
                    "type": "string",
                    "index": "not_analyzed"
                }
            }
        }
    }
}

阿拉伯语分析员:

{
  "settings": {
    "analysis": {
      "filter": {
        "arabic_stop": {
          "type":       "stop",
          "stopwords":  "_arabic_" 
        },
        "arabic_keywords": {
          "type":       "keyword_marker",
          "keywords":   [] 
        },
        "arabic_stemmer": {
          "type":       "stemmer",
          "language":   "arabic"
        }
      },
      "analyzer": {
        "arabic": {
          "tokenizer":  "standard",
          "filter": [
            "lowercase",
            "arabic_stop",
            "arabic_normalization",
            "arabic_keywords",
            "arabic_stemmer"
          ]
        }
      }
    }
  }
}

有人可以建议任何解决方案吗?谢谢!

1 个答案:

答案 0 :(得分:0)

您的第二个代码段定义了arabic analyzer,它已经可用,因此您不需要添加它。

你缺少的是告诉elasticsearch也使用阿拉伯分析仪。所以你希望analyze each field twice,英语和阿拉伯语。为此,请添加

"fields": {
            "ar": {
              "type":     "string",
              "analyzer": "arabic"
            },
            "en": {
              "type":     "string",
              "analyzer": "english"
            }
}

到您拥有"include_in_all": true的所有字段。这使您的mappings看起来像这样:

{
    "template": "index_com",
    "settings": {
        "number_of_shards": 5,
        "number_of_replicas": 1,
        "analysis": {
            "filter": {
                "edgeNGram_filter": {
                    "type": "edgeNGram",
                    "min_gram": 2,
                    "max_gram": 20
                }
            },
            "analyzer": {
                "edgeNGram_analyzer": {
                    "type": "custom",
                    "tokenizer": "whitespace",
                    "filter": [
                        "lowercase",
                        "asciifolding",
                        "edgeNGram_filter"
                    ]
                }
            }
        }
    },
    "mappings": {
        "product": {
            "_all": {
                "enabled": true,
                "index_analyzer": "edgeNGram_analyzer",
                "search_analyzer": "standard"
            },
            "properties": {
                "id": {
                    "type": "string",
                    "index": "no",
                    "include_in_all": false
                },
                "uuid": {
                    "type": "string",
                    "index": "no",
                    "include_in_all": false
                },
                "name": {
                    "type": "string",
                    "include_in_all": true,
                    "fields": {
                        "ar": {
                            "type": "string",
                            "analyzer": "arabic"
                        },
                        "en": {
                            "type": "string",
                            "analyzer": "english"
                        }
                    }
                },
                "description": {
                    "type": "string",
                    "include_in_all": true,
                    "fields": {
                        "ar": {
                            "type": "string",
                            "analyzer": "arabic"
                        },
                        "en": {
                            "type": "string",
                            "analyzer": "english"
                        }
                    }
                },
                "brand": {
                    "type": "string",
                    "include_in_all": true,
                    "fields": {
                        "ar": {
                            "type": "string",
                            "analyzer": "arabic"
                        },
                        "en": {
                            "type": "string",
                            "analyzer": "english"
                        }
                    }
                },
                "made_id": {
                    "type": "string",
                    "include_in_all": true,
                    "fields": {
                        "ar": {
                            "type": "string",
                            "analyzer": "arabic"
                        },
                        "en": {
                            "type": "string",
                            "analyzer": "english"
                        }
                    }
                },
                "category": {
                    "type": "string",
                    "include_in_all": true,
                    "fields": {
                        "ar": {
                            "type": "string",
                            "analyzer": "arabic"
                        },
                        "en": {
                            "type": "string",
                            "analyzer": "english"
                        }
                    }
                },
                "category_id": {
                    "type": "integer",
                    "include_in_all": false
                },
                "keywords": {
                    "type": "string",
                    "include_in_all": true,
                    "fields": {
                        "ar": {
                            "type": "string",
                            "analyzer": "arabic"
                        },
                        "en": {
                            "type": "string",
                            "analyzer": "english"
                        }
                    }
                },
                "colors": {
                    "type": "string",
                    "index": "not_analyzed"
                },
                "colors_name": {
                    "type": "string",
                    "include_in_all": true,
                    "fields": {
                        "ar": {
                            "type": "string",
                            "analyzer": "arabic"
                        },
                        "en": {
                            "type": "string",
                            "analyzer": "english"
                        }
                    }
                },
                "quality": {
                    "type": "string",
                    "index": "not_analyzed"
                },
                "vendor_name": {
                    "type": "string",
                    "include_in_all": false
                },
                "vendor_location": {
                    "type": "geo_point",
                    "include_in_all": false
                },
                "price": {
                    "type": "double",
                    "include_in_all": false
                },
                "price_before_discount": {
                    "type": "double",
                    "include_in_all": false
                },
                "is_deal": {
                    "type": "integer",
                    "include_in_all": false
                },
                "is_best_seller": {
                    "type": "integer",
                    "include_in_all": false
                },
                "views": {
                    "type": "integer",
                    "include_in_all": false
                },
                "rating": {
                    "type": "integer",
                    "include_in_all": false
                },
                "updated_at": {
                    "type": "date",
                    "format": "dateOptionalTime"
                },
                "created_at": {
                    "type": "date",
                    "format": "dateOptionalTime"
                },
                "image_link": {
                    "type": "string",
                    "index": "not_analyzed"
                }
            }
        }
    }
}