2016-01-15 57 views
0

所以我用这个“教程”,开始在elasticsearch特殊字符的工作:https://www.elastic.co/guide/en/elasticsearch/guide/current/case-folding.htmlElasticsearch:与ICU插件的特殊字符

我安装了elasticsearch分析ICU的版本2.7.0对我elasticsearch 1.7.x版

创建索引 “sonderzeichen” 与icu_tokenizer运行良好(I使用的NodeJS):

:我使用的两个分析器

var http = require('http'); 
    var body = JSON.stringify(
      { 
       "settings": { 
        "analysis": { 
         "analyzer": { 
          "my_lowercaser": { 
           "tokenizer": "icu_tokenizer", 
           "filter": [ "icu_normalizer" ] 
          } 
         } 
        } 
       } 
      } 
    ); 

    var options = { 
      host: 'localhost', 
      path: '/sonderzeichen', 
      port: 9200, 
      method: "PUT", 
      headers: { 
       'Content-Type': 'application/json', 
       'Content-Length': body.length 
      } 
    }; 

    callback = function(response) { 
     var str = ''; 
     response.on('data', function(chunk){ 
      str += chunk; 
     }); 

     response.on('end', function(){ 
      console.log(str); 
     }); 
    }; 


    http.request(options, callback).end(body); 

如教程中描述

/_analyze?analyzer=my_lowercaser 

/sonderzeichen/_analyze?analyzer=my_lowercaser 

在节点它看起来像这样:

var http = require('http'); 

    var body = decodeURIComponent("Weißkopfseeadler WEISSKOPFSEEADLER äÄöÖüÜßáÁéÉíÍóÓúÚàÀèÈìÌòÒùÙ"); 

    var options = { 
      host: 'localhost', 
      path: '/_analyze?analyzer=standard', 
      port: 9200, 
      method: "GET", 
      headers: { 
       'Content-Type': 'application/json', 
       'Content-Length': body.length 
      } 
    }; 

    callback = function(response) { 
     var str = ''; 
     response.on('data', function(chunk){ 
      str += chunk; 
     }); 

     response.on('end', function(){ 
      console.log(str); 
     }); 
    }; 


    http.request(options, callback).end(body); 

都返回完全相同的令牌,(如果我使用decodeURIComponent与否不论)如下:

{ 
     "tokens": [ 
     { 
      "token": "wei", 
      "start_offset": 0, 
      "end_offset": 3, 
      "type": "<ALPHANUM>", 
      "position": 1 
     }, 
     { 
      "token": "kopfseeadler", 
      "start_offset": 4, 
      "end_offset": 16, 
      "type": "<ALPHANUM>", 
      "position": 2 
     }, 
     { 
      "token": "weisskopfseeadler", 
      "start_offset": 17, 
      "end_offset": 34, 
      "type": "<ALPHANUM>", 
      "position": 3 
     } 
     ] 
    } 

弹性仍然似乎无法处理任何特殊字符,所以我去哪里wron G?

+0

如果你只处理与德国,我敢确信[ 'asciifolding'](https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-asciifolding-tokenfilter.html)令牌过滤器绰绰有余。在利用UCI插件之前,您应该尝试一下。 – Val

+0

我试过了,我必须使用它: 删除索引并重新创建它,替换'“分析”:{“analyzer”:{“my_lowercaser”:{“tokenizer”:“icu_tokenizer”,“filter”:[分析“:{”analyser“:{”default“:{”tokenizer“:”standard“,”filter“:[”standard“,”asciifolding“]}'并分析我用过'/sonderzeichen/_analyze?分析仪= default'。仍然得到相同的答案 – JTR

回答

0

我创建了sonderzeichen指数与下面的设置:

curl -XPUT localhost:9200/sonderzeichen -d '{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "default": { 
      "tokenizer": "standard", 
      "filter": [ 
      "standard", 
      "asciifolding" 
      ] 
     } 
     } 
    } 
    } 
}' 

完成后,我分析,你在你的问题提这样的输入字符串:

curl -XGET 'localhost:9200/sonderzeichen/_analyze?analyzer=default&pretty' -d 'Weißkopfseeadler WEISSKOPFSEEADLER äÄöÖüÜßáÁéÉíÍóÓúÚàÀèÈìÌòÒùÙ' 

而我得到的输出是下面的那个,看起来对我来说是正确的

{ 
    "tokens" : [ { 
    "token" : "Weisskopfseeadler", 
    "start_offset" : 0, 
    "end_offset" : 16, 
    "type" : "<ALPHANUM>", 
    "position" : 1 
    }, { 
    "token" : "WEISSKOPFSEEADLER", 
    "start_offset" : 17, 
    "end_offset" : 34, 
    "type" : "<ALPHANUM>", 
    "position" : 2 
    }, { 
    "token" : "aAoOuUssaAeEiIoOuUaAeEiIoOuU", 
    "start_offset" : 35, 
    "end_offset" : 62, 
    "type" : "<ALPHANUM>", 
    "position" : 3 
    } ] 
} 
+0

再次将您的代码完全复制到我的nodejs代码中,仍然得到错误的标记。我会在下周看到它,看看他们是否能找到错误。我们会在找到它时发布更新。再次感谢 – JTR

+0

请注意,在您的Node.js代码中,您没有触及sonderzeichen索引,而是使用了“标准”分析器。你应该用'/ sonderzeichen/_analyze?analyzer = default''替换'path' – Val

0

我们修好了它u唱出nodejs的弹性api。出于某种原因,通过节点发布http请求将返回一个mapperParsing异常! curl将工作并使用elasticsearch.Client将工作。 所以下面的版本(甚至不需要使用任何标记生成器或分析仪在这种情况下)的作品在我们的弹性环境中编写特殊字符:

var elasticsearch = require('elasticsearch'); 
    var client = new elasticsearch.Client({ 
     host: 'localhost:9200', 
     log: '' 
    }); 

    client.index({ 
     index: "sonderzeichen", 
     type: "randomType", 
     id: "randomId", 
     body: "Weißkopfseeadler WEISSKOPFSEEADLER äÄöÖüÜßáÁéÉíÍóÓúÚàÀèÈìÌòÒùÙ" 
    }, function (err, resp) { 
     if (err){ 
       console.error("error in method writeDB: " + err); 
       return; 
     } 
     console.log("callback from db request: " + JSON.stringify(resp)); 
    });