【问题标题】:Elasticsearch: Getting analyzer used for indexing a given field from the client sideElasticsearch:获取用于从客户端索引给定字段的分析器
【发布时间】:2016-09-06 23:05:28
【问题描述】:

有没有办法通过客户端以编程方式获取 Elasticsearch 服务器实例用于索引给定字段的 analyzer(当然,假设分析器在双方都可用)?

例如,使用如下映射:

{
    "mappings": {
        "article": {
            "properties": {
                "text": {
                    "type": "string",
                    "index": "analyzed",
                    "analyzer": "spanish"
                }
            }
        }
    }
}

如何使用the Java client for Elasticsearch 为字段text 获取org.apache.lucene.analysis.es.SpanishAnalyzer,如下所示?

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Collections;

import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;

public class QueryAnalyzerTest {

    public static void main(final String[] args) throws UnknownHostException {
        final String docTextFieldName = "text";
        Iterable<SearchHit> hits = Collections.emptyList();

        try (final Client client = TransportClient.builder().build()
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300))) {
            final QueryBuilder queryBuilder = QueryBuilders.matchQuery(docTextFieldName, "anuncio");
            final SearchRequestBuilder searchRequestBuilder = client.prepareSearch("news").setQuery(queryBuilder)
                    .setTypes("article");
            final SearchResponse response = searchRequestBuilder.get();
            hits = response.getHits();
        }

        hits.forEach(hit -> {
            final String docText = (String) hit.getSource().get(docTextFieldName);
            // TODO: Tokenize "docText" with the exact same tokenizer used when
            // indexing the field
        });

    }

}

【问题讨论】:

    标签: java elasticsearch lucene client analyzer


    【解决方案1】:

    您绝对可以使用client().admin().indices().prepareGetFieldMappings("indexName") 以编程方式获取text 字段的映射,并且您将能够检索分析器的逻辑名称(即“西班牙语”),但是,您不会得到分析器的类名。

    为此,您需要调用AnalysisRegistry.getAnalyzer("spanish"),您将获得正确的分析器实例。

    【讨论】:

    • 第一部分很到位,但不幸的是我没有 AnalysisRegistry 类(我正在运行 Elasticsearch 2.3.2); API 有变化吗?
    • 不,但可能 AnalysisRegistry 没有包含在客户端 JAR 中,这不会让我感到惊讶。
    • 这个运气好吗?您需要更多信息吗?
    • 不多:我发现有一个org.elasticsearch.index.analysis.AnalysisServiceorg.elasticsearch.index.analysis.AnalysisModule在客户端可用,但相关实例似乎是由嵌入式Guice框架注入的;我仍然不确定如何获取这些注入的实例——或者即使它们根本就在客户端。
    • 有了AnalysisService.analyzer("spanish"),你什么都得不到?
    猜你喜欢
    • 1970-01-01
    • 2017-06-27
    • 2018-10-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    相关资源
    最近更新 更多