Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用Spark和Scala为elasticsearch索引定义过滤器/属性?_Python_Scala_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Apache Spark - Fatal编程技术网 elasticsearch,apache-spark,Python,Scala,elasticsearch,Apache Spark" /> elasticsearch,apache-spark,Python,Scala,elasticsearch,Apache Spark" />

Python 如何使用Spark和Scala为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

我在Python中使用了以下函数来初始化Elasticsearch中的索引

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
,也可以使用Hadoop
org.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"))