我正在构建一个应用程序,该应用程序可以在Elasticsearch中索引一堆文档,并通过布尔查询将文档检索到Spark中进行机器学习。我正试图通过Python通过pySpark和elasticsearch完成这一切。
对于机器学习部分,我需要使用每个文本文档中的标记创建特性。要做到这一点,我需要处理/分析每个文档中典型的东西,如小写,词干,删除停止词等。
因此,基本上,我需要把"Quickly the brown fox is getting away."变成类似"quick brown fox get away"或["quick", "brown", "fox", "get", "away"]的东西。我知道您可以通过各种Python包和函数很容易地做到这一点,但是我想使用Elasticsearch分析器来实现这一点。此外,我需要以一种对大数据集有效的方式来实现它。
基本上,我希望直接从Elasticsearch中提取文本的分析版本或分析标记,并以高效的方式在Spark框架内完成它。作为相对的ES新手,我已经知道如何通过调整elasticsearch-hadoop插件来直接从Spark查询文档:
http://blog.qbox.io/elasticsearch-in-apache-spark-python
基本上是这样的:
read_conf = {
'es.nodes': 'localhost',
'es.port': '9200',
'es.resource': index_name + '/' + index_type,
'es.query': '{ "query" : { "match_all" : {} }}',
}
es_rdd = sc.newAPIHadoopRDD(
inputFormatClass = 'org.elasticsearch.hadoop.mr.EsInputFormat',
keyClass = 'org.apache.hadoop.io.NullWritable',
valueClass = 'org.elasticsearch.hadoop.mr.LinkedMapWritable',
conf = read_conf)此代码将或多或少地从ES检索未分析的原始文本存储版本。我还没有搞清楚的是如何高效地查询分析过的文本/标记。到目前为止,我已经想出了两种可能的方法:
见related:Elasticsearch analyze() not compatible with Spark in Python?
据我所知,这两种方法对于大型数据集来说都是极其低效的,因为它们涉及对RDD中的每个记录进行REST调用。
因此,我的问题是
发布于 2015-08-26 01:34:05
通过在搜索查询的正文中使用"fielddata_fields“参数,我可能找到了一个临时的解决方案。
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-fielddata-fields.html
例如,
read_conf = {
'es.nodes': 'localhost',
'es.port': '9200',
'es.resource': index_name + '/' + index_type,
'es.query': '{ "query" : { "match_all" : {} }, "fields": ["_id"], "fielddata_fields": "text" }',
} 返回带有id的文档和"text“字段的(分析)标记。目前还不清楚这会如何影响我工作中的内存消耗。它也不包括文档中每个令牌的频率一词,这可能是必要的信息。如果有人知道如何将术语频率加到令牌中,我很想听听。
https://stackoverflow.com/questions/32193083
复制相似问题