尝试在Elasticsearch中设置max_gram和min_gram

时间:2019-08-07 13:44:03

标签: ruby-on-rails elasticsearch

我正在尝试在Ubuntu 16.04 EC2服务器上部署Ruby on Rails应用,但是给出了关于Elasticsearch上max_gram和min_gram之间差异的错误,我没有任何Elasticsearch经验,所以我在这里完全迷失了,我需要一些指导来做到这一点,并学习如何设置它以避免将来出现此问题。

我第一次进行部署时,出现错误,拒绝与localhost:9200的连接,因此我不得不检查服务是否正在运行,甚至检查防火墙,最后我必须进行全新安装并配置所有内容在elasticsearch.yml上,现在正在运行并正常工作,但是当我再次尝试部署时出现错误,在Internet上进行了大量搜索,虽然有很多文档,但是我仍然无法在哪里设置这些值。 / p>

这是即时通讯上出现的错误:

Scanner myObj = new Scanner(System.in);  // Create a Scanner object
System.out.println("Enter username");

String userName = myObj.nextLine();  // Read user input

elasticsearch上没有索引文件,默认模板上没有关于此设置的任何信息

2 个答案:

答案 0 :(得分:2)

我遇到了类似的问题,并且以下错误消息清楚地解释了该问题。

  

[400]   {“ error”:{“ root_cause”:[{“ type”:“ illegal_argument_exception”,“ reason”:“ The   NGram Tokenizer中的max_gram和min_gram之间的差异必须为   小于或等于:1,但为[49]。可以通过以下方式设置此限制   更改[index.max_ngram_diff]索引级别   设置。“}],”类型“:” illegal_argument_exception“,”原因“:”   NGram Tokenizer中的max_gram和min_gram之间的差异必须为   小于或等于:1,但为[49]。可以通过以下方式设置此限制   更改[index.max_ngram_diff]索引级别   设置。“},”状态“:400}

基本上,默认情况下,NGram Tokenizer中的max_gram和min_gram之差不能超过1,并且如果您要更改此值,则在索引设置中,您需要通过添加以下设置来进行更改。

"max_ngram_diff" : "50" --> you can mention this number accoding to your requirement.

下面是我的索引设置,您可以在其中看到我的47max_grammin_gram的区别,因此将max_ngram_diff设置为50

{ 
    "settings": {
        "index": {
            "analysis": {
                "analyzer": {
                    "prefix": {
                        "type": "custom",
                        "filter": [
                            "lowercaseFilter"
                        ],
                        "tokenizer": "edgeNGramTokenizer"
                    }
                },
                "tokenizer": {
                    "edgeNGramTokenizer": {
                        "token_chars": [
                            "letter",
                            "digit"
                        ],
                        "min_gram": "1",
                        "type": "edgeNGram",
                        "max_gram": "40"
                    },
                    "loginNGram": {
                        "type": "nGram",
                        "min_gram": "3",
                        "max_gram": "50"
                    }
                }
            },
            "number_of_shards": "1",
            "number_of_replicas": "0",
            "max_ngram_diff" : "50"
        }
    }
} 

编辑:添加一个official弹性文档,该文档解释说max_gram的默认长度为2而min_gram的默认长度为1,因此它们之间的默认差不能超过1,因此例外。然后来自同一文档的代码段

  

索引级别设置index.max_ngram_diff控制最大值   允许max_gram和min_gram之间的差异。

答案 1 :(得分:2)

还可以使用索引模板将设置自动应用于所有新索引:

curl -X PUT "localhost:9200/_index_template/template_1?pretty" -H 'Content-Type: application/json' -d'
{
  "index_patterns": [
      "*"
  ],
  "template": {
    "settings": {
      "index": {
         "max_ngram_diff": 50
      }
    }
  }
}
'

删除每个索引不会删除模板,而是必须手动删除:

curl -X DELETE "localhost:9200/_index_template/template_1