2017-03-06 5 views
0

EDR-00004をトークンに変換できるElasticsearch pattern_captureフィルタを実装しようとしています:[EDR-00004、00004、4]私はまだElasticsearch 2.4で作業していますが、現在のESバージョンのドキュメントとの違いはありません。pattern_captureトークンフィルタの実装に失敗しました

私はドキュメントの例を踏襲しています https://www.elastic.co/guide/en/elasticsearch/reference/2.4/analysis-pattern-capture-tokenfilter.html

これは私のテスト、結果、次のとおりです。

curl -XPUT 'localhost:9200/test_index' -d '{ 
    "settings": { 
     "analysis": { 
      "filter": { 
       "process_number_filter": { 
        "type": "pattern_capture", 
        "preserve_original": 1, 
        "patterns": [ 
         "([A-Za-z]+-([0]+([0-9]+)))" 
        ] 
       } 
      }, 
      "analyzer": { 
       "process_number_analyzer": { 
        "type": "custom", 
        "tokenizer": "pattern", 
        "filter": ["process_number_filter"] 
       } 
      } 
     } 
    } 
}' 

curl -XGET 'localhost:9200/test_index/_analyze' -d ' 
{ 
    "analyzer": "process_number_analyzer", 
    "text": "EDR-00002" 
}' 

curl -XGET 'localhost:9200/test_index/_analyze' -d ' 
{ 
    "analyzer": "standard", 
    "tokenizer": "standard", 
    "filter": ["process_number_filter"], 
    "text": "EDR-00002" 
}' 

戻り値:

{"acknowledged":true} 

{ 
    "tokens": [{ 
     "token": "EDR", 
     "start_offset": 0, 
     "end_offset": 3, 
     "type": "word", 
     "position": 0 
    }, { 
     "token": "00002", 
     "start_offset": 4, 
     "end_offset": 9, 
     "type": "word", 
     "position": 1 
    }] 
} 

{ 
    "tokens": [{ 
     "token": "edr", 
     "start_offset": 0, 
     "end_offset": 3, 
     "type": "<ALPHANUM>", 
     "position": 0 
    }, { 
     "token": "00002", 
     "start_offset": 4, 
     "end_offset": 9, 
     "type": "<NUM>", 
     "position": 1 
    }] 
} 

私は

    ことを理解0
  1. 私はpreserve_originalを設定しているので、正規表現全体をグループ化する必要はありません
  2. 私は\ dと\ wのどちらかに置き換えることができますが、エスケープについて考える必要はありません。

また正規表現が正しいことを確認しました。

>>> m = re.match(r"([A-Za-z]+-([0]+([0-9]+)))", "EDR-00004")                                             
>>> m.groups() 
('EDR-00004', '00004', '4') 

答えて

0

私自身の質問に答えるのが嫌いですが、私は答えを見つけて、将来的に人々を助けることができました。

私の問題は、フィルタに渡す前にテキストを分割するデフォルトのトークナイザです。既定のスプリッタ"\W+""[^\\w-]+"に上書きする独自のトークナイザを追加することで、私のフィルタは単語全体を受け取り、正しいトークンを作成しました。

これが今の私のカスタム設定である:

{ 
    "tokens": [ 
     { 
      "token": "EDR-00002", 
      "start_offset": 0, 
      "end_offset": 9, 
      "type": "word", 
      "position": 0 
     }, 
     { 
      "token": "00002", 
      "start_offset": 0, 
      "end_offset": 9, 
      "type": "word", 
      "position": 0 
     }, 
     { 
      "token": "2", 
      "start_offset": 0, 
      "end_offset": 9, 
      "type": "word", 
      "position": 0 
     } 
    ] 
} 
:次のような結果につながる

curl -XPUT 'localhost:9200/test_index' -d '{ 
    "settings": { 
     "analysis": { 
      "filter": { 
       "process_number_filter": { 
        "type": "pattern_capture", 
        "preserve_original": 1, 
        "patterns": [ 
         "([A-Za-z]+-([0]+([0-9]+)))" 
        ] 
       } 
      }, 
      "tokenizer": { 
       "process_number_tokenizer": { 
        "type": "pattern", 
        "pattern": "[^\\w-]+" 
       } 
      }, 
      "analyzer": { 
       "process_number_analyzer": { 
        "type": "custom", 
        "tokenizer": "process_number_tokenizer", 
        "filter": ["process_number_filter"] 
       } 
      } 
     } 
    } 
}' 

関連する問題