JanusGraph 索引后端之 Elasticsearch 安装配置
Elasticsearch是一个分布式RESTful搜索和分析引擎,能够解决越来越多的用例。 作为Elastic Stack的核心,它集中存储您的数据,以便您可以发现预期并发现意外情况。
JanusGraph 支持 Elasticsearch 作为索引后端。 以下是 JanusGraph 支持的一些 Elasticsearch 功能:
- Full-Text:支持所有
Text
谓词搜索给定单词、前缀或正则表达式匹配的文本属性。 - Geo:支持所有在给定查询几何体中相交、within、不相交或包含的
Geo
谓词搜索地理属性。 支持用于索引的点、圆、框、线和多边形。 支持圆、框和多边形用于查询点属性和所有形状以查询非点属性。 - Numeric Range:支持所有数字比较。
- Flexible Configuration:支持远程操作和自定义的开放式设置。
- Collections:支持索引 SET 和 LIST 基数的属性。
- Temporal:纳秒粒度时间索引。
- Custom Analyzer:选择使用自定义分析器。
- Not Query-normal-form:支持 Query-normal-form(QNF)以外的查询。 JanusGraph 的 QNF 是 CNF(conjunctive normal form)的变体,在可能的情况下否定内联。
有关哪些版本的 Elasticsearch 可与 JanusGraph 配合使用的详细信息,请参阅 附录B,版本兼容性。
重要:从 Elasticsearch 5.0 开始,JanusGraph 使用沙盒 Painless scripts 进行内联更新,默认情况下在 Elasticsearch 5.x 中启用。 将 JanusGraph 与 Elasticsearch 2.x 一起使用需要通过在 Elasticsearch 集群上将
script.engine.groovy.inline.update
设置为 `true 来启用 Groovy 内联脚本(有关详细信息,请参阅动 态脚本文档)。
27.1 运行 Elasticsearch
JanusGraph 支持与正在运行的 Elasticsearch 集群的连接。JanusGraph 提供了两个选项来运行本地 Elasticsearch 实例以便快速入门。JanusGraph 服务(参见第7.1节“入门”,译著:参见翻译 Chapter 7. JanusGraph Server)会自动启动本地 Elasticsearch 实例。另外,JanusGraph 发行版包含一个完整的 Elasticsearch 发行版,允许用户手动启动本地 Elasticsearch 实例(有关详细信息,请参阅 此页面)。
$ elasticsearch/bin/elasticsearch
提示:出于安全原因,Elasticsearch 必须在非 root 帐户下运行
27.2 Elasticsearch 配置概述
JanusGraph 支持与正在运行的 Elasticsearch 集群的 HTTP(S) 客户端连接。 有关哪些版本的 Elasticsearch 可以与 JanusGraph 中的不同客户端类型一起使用的详细信息,请参阅 附录B,版本兼容性。
提示:JanusGraph 的索引选项以字符串
index.[X].
开头。 其中[X]
是后端的用户定义名称。 在构建混合索引时,必须将此用户定义的名称传递给 JanusGraph 的 ManagementSystem 接口,如 第11.1.2节“混合索引” 中所述,以便 JanusGraph 知道可能使用多个已配置的索引后端。 本章中的配置片段使用名称search
,而对选项的讨论通常在同一位置写入[X]
。 只要在 JanusGraph 的配置中以及管理索引时一致使用,确切的索引名称就不重要了。贴士:建议索引名称仅包含字母、数字、小写字符和连字符,并且它们以小写字母开头。
27.2.1 连接 Elasticsearch
像下面这样指定 Elasticsearch client:
index.search.backend=elasticsearch
连接到 Elasticsearch 时,必须提供 Elasticsearch 实例的单个或主机名列表。 这些是通过 JanusGraph 的 index.[X].hostname
键提供的。
index.search.backend=elasticsearch
index.search.hostname=10.0.0.10:9200
此处指定的每个 host 或 host:port 对将添加到 HTTP 客户端的请求目标轮询调度列表中。 这是一个最小配置,它将在 10.0.0.10 上默认的 Elasticsearch HTTP 端口(9200)上轮询调度,在 10.0.0.20 端口 7777 轮询调度:
index.search.backend=elasticsearch
index.search.hostname=10.0.0.10, 10.0.0.20:7777
27.2.1.1 JanusGraph index.[X]
和 index.[X].elasticsearch
选项
JanusGraph 仅使用 index-name
和 health-request-timeout
的默认值。有关这些选项及其可接受值的说明,请参见 第15章,配置参考。
- index.[X].elasticsearch.index-name
- index.[X].elasticsearch.health-request-timeout
27.2.2 REST 客户端选项
REST 客户端接受 index.[X].bulk-refresh
选项。 此选项控制何时使更改对搜索可见。 有关更多信息,请参阅 refresh 文档。
27.2.3 REST 客户端 HTTPS 配置
可以通过将 index.[X].elasticsearch.ssl.enabled
配置选项设置为 true
来启用对 HTTP 的 SSL 支持。
请注意,根据您的配置,如果您的 HTTPS 端口号与 REST API 的默认端口号(9200)不同,则可能需要更改 index.[X].port
的值。
启用 SSL 后,您还可以配置信任库的位置和密码。 这可以按如下方式完成:
index.search.elasticsearch.ssl.truststore.location=/path/to/your/truststore.jks
index.search.elasticsearch.ssl.truststore.password=truststorepwd
请注意,这些设置仅适用于 Elasticsearch REST 客户端,不会影响 JanusGraph 中的任何其他 SSL 连接。
还支持客户端密钥库的配置:
index.search.elasticsearch.ssl.keystore.location=/path/to/your/keystore.jks
index.search.elasticsearch.ssl.keystore.storepassword=keystorepwd
index.search.elasticsearch.ssl.keystore.keypassword=keypwd
任何密码都可以为空。
如果需要,可以通过将 index.[X].elasticsearch.ssl.disable-hostname-verification
属性值设置为 true
来禁用 SSL 主机名验证,并且可以通过设置index.[X].elasticsearch.ssl.allow-self-signed-certificates
属性值为 true
来启用对自签名 SSL 证书的支持。
贴士:建议不要依赖自签名SSL证书或禁用生产系统的主机名验证,因为它会严重限制客户端与 Elasticsearch 服务器提供安全通信通道的能力。 这可能导致泄露机密数据,这可能是您的 JanusGraph 索引的一部分。
27.2.4 REST 客户端 HTTP 身份验证
REST 客户端支持以下身份验证选项:基本 HTTP 身份验证(用户名/密码)和基于用户提供的实现的自定义身份验证。
这些身份验证方法独立于上述 SSL 客户端身份验证。
27.2.4.1 REST 客户端基本 HTTP 身份验证
无论 SSL 支持的状态如何,都可以使用基本 HTTP 身份验证。 可选地,可以通过 index.[X].elasticsearch.http.auth.basic.realm
属性指定认证领域(authentication realm)。
index.search.elasticsearch.http.auth.type=basic
index.search.elasticsearch.http.auth.basic.username=httpuser
index.search.elasticsearch.http.auth.basic.password=httppassword
贴士:强烈建议在使用此选项时使用 SSL(例如,将
index.[X].elasticsearch.ssl.enabled
设置为true
),因为在通过未加密的连接发送时可以拦截凭据!
27.2.4.2 REST 客户端自定义 HTTP 身份验证
可以通过提供自己的实现来实现其他身份验证方法。 自定义身份验证器配置如下:
index.search.elasticsearch.elasticsearch.http.auth.custom.args=arg1,arg2,...
</code>
index.search.elasticsearch.http.auth.custom.authenticator-class=fully.qualified.class.Name
index.search.elasticsearch.elasticsearch.http.auth.custom.authenticator-args=arg1,arg2,...
参数列表是可选的,可以为空。
指定的类必须实现 org.janusgraph.diskstorage.es.rest.util.RestClientAuthenticator
接口或扩展 org.janusgraph.diskstorage.es.rest.util.RestClientAuthenticatorBase
类。
该实现可以访问HTTP客户端配置,并可以根据需要自定义客户端。有关更多信息,请参阅 附录A,API文档(JavaDoc)。
例如,以下代码段实现了一个身份验证器,允许 Elasticsearch REST 客户端进行身份验证并获得针对 AWS IAM 的授权:
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.janusgraph.diskstorage.es.rest.util.RestClientAuthenticatorBase;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.regions.DefaultAwsRegionProviderChain;
import com.google.common.base.Supplier;
import vc.inreach.aws.request.AWSSigner;
import vc.inreach.aws.request.AWSSigningRequestInterceptor;
/**
* <p>
* Elasticsearch REST HTTP(S) client callback implementing AWS request signing.
* </p>
* <p>
* The signer is based on AWS SDK default provider chain, allowing multiple options for providing
* the caller credentials. See {@link DefaultAWSCredentialsProviderChain} documentation for the details.
* </p>
*/
public class AWSV4AuthHttpClientConfigCallback extends RestClientAuthenticatorBase {
private static final String AWS_SERVICE_NAME = "es";
private HttpRequestInterceptor awsSigningInterceptor;
public AWSV4AuthHttpClientConfigCallback(final String[] args) {
// does not require any configuration
}
@Override
public void init() throws IOException {
DefaultAWSCredentialsProviderChain awsCredentialsProvider = new DefaultAWSCredentialsProviderChain();
final Supplier<LocalDateTime> clock = () -> LocalDateTime.now(ZoneOffset.UTC);
// using default region provider chain
// (http://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/java-dg-region-selection.html)
DefaultAwsRegionProviderChain regionProviderChain = new DefaultAwsRegionProviderChain();
final String awsRegion = regionProviderChain.getRegion();
final AWSSigner awsSigner = new AWSSigner(awsCredentialsProvider, awsRegion, AWS_SERVICE_NAME, clock);
this.awsSigningInterceptor = new AWSSigningRequestInterceptor(awsSigner);
}
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.addInterceptorLast(awsSigningInterceptor);/
}
}
此自定义身份验证器不使用任何构造函数参数。
翻译自官方文档原文地址:JanusGraph Documentation > Index Backends > Elasticsearch