Python 如何使用Spark和Scala为elasticsearch索引定义过滤器/属性?
我在Python中使用了以下函数来初始化Elasticsearch中的索引Python 如何使用Spark和Scala为elasticsearch索引定义过滤器/属性?,python,scala,
elasticsearch,apache-spark,Python,Scala,
elasticsearch,Apache Spark,我在Python中使用了以下函数来初始化Elasticsearch中的索引 def init_index(): constants.ES_CLIENT.indices.create( index = constants.INDEX_NAME, body = { "settings": { "index": { "type": "defau
def init_index():
constants.ES_CLIENT.indices.create(
index = constants.INDEX_NAME,
body = {
"settings": {
"index": {
"type": "default"
},
"number_of_shards": 1,
"number_of_replicas": 1,
"analysis": {
"filter": {
"ap_stop": {
"type": "stop",
"stopwords_path": "stoplist.txt"
},
"shingle_filter" : {
"type" : "shingle",
"min_shingle_size" : 2,
"max_shingle_size" : 5,
"output_unigrams": True
}
},
"analyzer": {
constants.ANALYZER_NAME : {
"type": "custom",
"tokenizer": "standard",
"filter": ["standard",
"ap_stop",
"lowercase",
"shingle_filter",
"snowball"]
}
}
}
}
}
)
new_mapping = {
constants.TYPE_NAME: {
"properties": {
"text": {
"type": "string",
"store": True,
"index": "analyzed",
"term_vector": "with_positions_offsets_payloads",
"search_analyzer": constants.ANALYZER_NAME,
"index_analyzer": constants.ANALYZER_NAME
}
}
}
}
constants.ES_CLIENT.indices.put_mapping (
index = constants.INDEX_NAME,
doc_type = constants.TYPE_NAME,
body = new_mapping
)
使用这个函数,我能够根据用户定义的规范创建索引
我最近开始与scala和spark合作。为了将elasticsearch集成到这个系统中,我可以使用Spark的API,即org.elasticsearch.Spark
,也可以使用Hadooporg.elasticsearch.Hadoop
。我看到的大多数示例都与Hadoop的方法有关,但我不希望在这里使用Hadoop。我使用了Spark elasticsearch,能够在不包含Hadoop的情况下为文档编制索引,但我注意到这创建了默认的一切,我甚至不能在那里指定\u id
。它自己生成\u id
在scala中,我使用以下代码进行索引(不是完整的代码):
这样就创建了一个索引:
{
"es_park_ap": {
"mappings": {
"document": {
"properties": {
"id": {
"type": "string"
},
"text": {
"type": "string"
}
}
}
},
"settings": {
"index": {
"creation_date": "1433006647684",
"uuid": "QNXcTamgQgKx7RP-h8FVIg",
"number_of_replicas": "1",
"number_of_shards": "5",
"version": {
"created": "1040299"
}
}
}
}
}
因此,如果我将文档传递给它,将创建以下文档:
{
"_index": "es_park_ap",
"_type": "document",
"_id": "AU2l2ixcAOrl_Gagnja5",
"_score": 1,
"_source": {
"text": "some large text",
"id": "12345"
}
}
就像Python一样,如何使用Spark和Scala创建具有用户定义规范的索引?我认为我们应该将您的问题分成几个小问题 如果您想创建具有特定映射/设置的索引,您应该直接使用elasticsearch JAVA api(当然,您可以从Scala代码中使用它)。 您可以使用以下来源作为使用Scala创建索引的示例: Elasticsearch Hadoop/Spark插件用于将数据轻松地从HDFS传输到ES。ES维护应单独进行 您仍然可以看到自动生成的id,这是因为您必须使用以下语法为插件指定您的id字段:
EsSpark.saveToEs(rdd, "spark/docs", Map("es.mapping.id" -> "your_id_field"))
或者在您的情况下:
sc.makeRDD(Seq(document)).saveToEs("es_park_ap/document", Map("es.mapping.id" -> "your_id_field"))
您可以在此处找到有关语法和正确使用的更多详细信息:
迈克尔同意。Spark的目标不同于维护和使用ES群集。因此,Spark在ES之上起着抽象的作用。您应该使用此处列出的任何scala客户端(如果您使用的是scala)来处理ES群集
sc.makeRDD(Seq(document)).saveToEs("es_park_ap/document", Map("es.mapping.id" -> "your_id_field"))