我正在尝试构建一个应用程序来索引Elasticsearch中的一堆文档,并通过布尔查询将文档检索到Spark中以进行机器学习。我试图通过pySpark和elasticsearch-py。
来完成所有这些对于机器学习部分,我需要使用每个文本文档中的标记创建功能。为此,我需要处理/分析每个文档的典型内容,如小写,词干,删除停用词等。
所以基本上我需要将"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检索未分析的原始存储版本的文本。我还没想到的是如何以有效的方式查询分析的文本/令牌。到目前为止,我已经找到了两种可能的方法:
参见相关内容:Elasticsearch analyze() not compatible with Spark in Python?
根据我的理解,这两种方法对于大数据集来说都是非常低效的,因为它们涉及对RD中每条记录的ES调用。
因此,我的问题是
答案 0 :(得分:1)
我可能通过使用" 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"领域。目前还不清楚这会如何影响我工作中的记忆消耗。它还不包括文档中每个标记的术语频率,这可能是必要的信息。如果有人知道如何在标记中添加术语频率,我很乐意听到它。