当前位置: 首页 > 面试题库 >

如何在ElasticSearch中添加分析仪设置?

法景明
2023-03-14
问题内容

我正在使用ElasticSearch 1.5.2,希望具有以下设置:

"settings": {
"analysis": {
    "filter": {
        "filter_shingle": {
            "type": "shingle",
            "max_shingle_size": 2,
            "min_shingle_size": 2,
            "output_unigrams": false
        },
        "filter_stemmer": {
            "type": "porter_stem",
            "language": "English"
        }
    },
    "tokenizer": {
        "my_ngram_tokenizer": {
            "type": "nGram",
            "min_gram": 1,
            "max_gram": 1
        }
    },
    "analyzer": {
        "ShingleAnalyzer": {
            "tokenizer": "my_ngram_tokenizer",
            "filter": [
                "standard",
                "lowercase",
                "filter_stemmer",
                "filter_shingle"
            ]
        }
    }
  }
}

我应该在哪里添加它们?我的意思是在创建索引之前还是之后?

通过在线搜索,我发现了一些类似的方法

client.admin().indices().prepareCreate("temp_index").setSettings(ImmutableSettings.settingsBuilder().loadFromSource((jsonBuilder()
    .startObject()
       .startObject("analysis")
          .startObject("analyzer")......and so on)

但是我有2个问题,

  1. 我收到编译错误:ImmutableSettings.builder类型的方法loadFromSource不适用于参数XContentBuilder

  2. 另外,我不知道如何将我的设置转换为这种格式。在哪里可以找到有关所有这些方法的文档?我尝试阅读官方的ElasticSearch JAVA API https://www.elastic.co/guide/zh-cn/elasticsearch/client/java-api/current/search.html,但找不到任何有关设置分析仪的信息。我发现的所有相关内容仅是REST API的形式,而不是Java API。


问题答案:

XContentBuilder 具有特定的语法,可用于创建json对象。

您可以按照https://www.elastic.co/guide/zh-CN/elasticsearch/client/java-
api/current/index_.html#helpers
将字符串转换为XContentBuilder格式。

如果您在应用程序中加载了相同的字符串。您可以做到。

    client.admin().indices()
.prepareCreate("index_name").setSettings("{setting _ json _ string }").get()

只会工作。

如果您想知道JSON在XContentBuilder中的外观,那么就在这里,

XContentBuilder settingsBuilder = XContentFactory.jsonBuilder()
        .startObject()
            .startObject("analysis")
                .startObject("filter")
                    .startObject("filter_shingle")
                        .field("type","shingle")
                        .field("max_shingle_size",2)
                        .field("min_shingle_size",2)
                        .field("output_unigrams",false)
                    .endObject()
                    .startObject("filter_stemmer")
                        .field("type","porter_stem")
                        .field("language","English")
                    .endObject()
                .endObject()
                .startObject("tokenizer")
                    .startObject("my_ngram_tokenizer")
                        .field("type","nGram")
                        .field("min_gram",1)
                        .field("max_gram",1)
                    .endObject()
                .endObject()
                .startObject("analyzer")
                    .startObject("ShingleAnalyzer")
                        .field("tokenizer","my_ngram_tokenizer")
                        .array("filter","standard","lowercase","filter_stemmer","filter_shingle")
                    .endObject()
                .endObject()
            .endObject()
        .endObject()

client.admin().indices()
.prepareCreate("index_name").setSettings(settingsBuilder).get()


 类似资料:
  • 问题内容: 我最近一直在尝试用Elasticsearch在Rails上使用ruby。我在为数据编制索引时遇到麻烦,因此我可以搜索带有复数和非复数关键字的项目。 Tire将允许我为每个映射属性分配一个分析器: 现在,假设我在“测试”标题中有一个关键字 如果我使用查询中的属性进行搜索: http:// localhost:9200 / myindex / mymapping / _search?q =

  • 我有一个法语单词索引。我想在索引属性上应用一个分析器。假设我有一个标题属性,我想将其视为“法国属性”。我试过这个(在基巴纳): 但它导致: 我不明白为什么我会有这个错误。如果我显示映射(

  • 我有一个elasticsearch请求如下: 我想在这个请求中添加分页,就像 我搜索了很多,找到了一个关于它的链接:https://github.com/elastic/elasticsearch/issues/4915. 但我仍然没有得到实现方法。 有没有办法通过Elasticsearch本身而不是我的应用程序来实现它?

  • 问题内容: 我正在使用Sense(Chrome插件),并且已经成功设置了分析仪,并且可以正常工作。如果我在设置上发出GET(/ media / _settings),则返回以下内容。 我正在尝试通过执行以下操作来更新它: 关闭索引 发出此PUT命令(删除过滤器) 打开索引 但是,当设置恢复时,不会删除过滤器。创建分析器后,是否可以不对其进行更新? 问题答案: 简短答案:不可以。 更长的答案。从ES

  • 问题内容: 我在ElasticSearch字段中有一个我不想分析的字段,即应逐字存储和比较它。这些值将包含字母,数字,空格,破折号,斜杠以及其他字符。 如果我在此字段的映射中未提供分析器,则默认值仍会使用标记程序,该标记程序会将我的逐字字符串分成大量单词。我不要 是否有一个超级简单的分析器,基本上不分析?还是有另一种方式表示不应分析此字段? 我只创建索引,我什么也没做。我可以在其他字段中使用“英语

  • 问题内容: 我从第一页的API解析数据并将其添加到中,现在页面可以是多个,比如说100,我也可以从API获取页面总数。但是我将如何在tableView中为每个页面实现它并在滚动时显示指示器。看看我的代码 问题答案: 有很多方法可以实现这一点,例如以下方法: 首先,您需要创建一个在Delegates和中加载的全局变量。 现在,在您的api调用上,您需要在全局数组中添加That记录。 在最后一个单元格