如何在弹性搜索中使用内置或自定义分析器搜索数字和单词

时间:2017-10-22 10:28:21

标签: elasticsearch lucene tokenize elasticsearch-analyzers

这个问题继续我以前的this SO问题。我有一些文字,我想在其上搜索数字和文字。

我的文字: -

  

8080 amit.foobar.getFooLabelFrombar(test.java:91)

我想搜索getFooLabelFrombarfooBar808091

之前我使用的是simple分析器,它将上述文本标记为以下标记。

 "tokens": [
    {
      "token": "amit",
      "start_offset": 5,
      "end_offset": 9,
      "type": "word",
      "position": 1
    },
    {
      "token": "foobar",
      "start_offset": 10,
      "end_offset": 16,
      "type": "word",
      "position": 2
    },
    {
      "token": "getfoolabelfrombar",
      "start_offset": 17,
      "end_offset": 35,
      "type": "word",
      "position": 3
    },
    {
      "token": "test",
      "start_offset": 36,
      "end_offset": 40,
      "type": "word",
      "position": 4
    },
    {
      "token": "java",
      "start_offset": 41,
      "end_offset": 45,
      "type": "word",
      "position": 5
    }
  ]
}

Beaucase,foobargetFooLabelFrombar搜索结果但未提供808091,因为简单分析器不会标记数字

然后如上所述。 SO post,我将分析器更改为Standard,因为哪些数字是可搜索的,但不是其他2个字搜索字符串。标准分析器会创建以下标记: -

{
  "tokens": [
    {
      "token": "8080",
      "start_offset": 0,
      "end_offset": 4,
      "type": "<NUM>",
      "position": 1
    },
    {
      "token": "amit.foobar.getfoolabelfrombar",
      "start_offset": 5,
      "end_offset": 35,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "test.java",
      "start_offset": 36,
      "end_offset": 45,
      "type": "<ALPHANUM>",
      "position": 3
    },
    {
      "token": "91",
      "start_offset": 46,
      "end_offset": 48,
      "type": "<NUM>",
      "position": 4
    }
  ]
}

我在ES中使用了所有现有的分析仪,但似乎没有任何东西满足我的要求。我尝试创建我的下面的自定义分析器,但它也不起作用。

{
    "analysis" : {
            "analyzer" : {
                "my_analyzer" : {
                    "tokenizer" : "letter"
                    "filter" : ["lowercase", "extract_numbers"]
                }
            },
            "filter" : {
                "extract_numbers" : {
                    "type" : "keep_types",
                    "types" : [ "<NUM>","<ALPHANUM>","word"]
                }
            }
        }
}

请建议,我如何构建我的自定义分析器以满足我的要求。

1 个答案:

答案 0 :(得分:2)

使用字符过滤器用空格替换点怎么样?

PUT /my_index
{                                                                                     
  "settings": {                                                                                                                                    
    "analysis": {
      "analyzer": {                                                                                                                                
        "my_analyzer": {                                                                                                                           
          "tokenizer": "standard",
          "char_filter": ["replace_dots"]
        }
      },
      "char_filter": {
        "replace_dots": {
          "type": "mapping",
          "mappings": [
            ". => \\u0020"
          ]
        }
      }
    }
  }
}

POST /my_index/_analyze
{                                                                           
  "analyzer": "my_analyzer",                                            
  "text": "8080 amit.foobar.getFooLabelFrombar(test.java:91)"
}

哪个输出你想要的东西:

{                                                                               
  "tokens" : [
    {
      "token" : "8080",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "<NUM>",
      "position" : 0
    },
    {
      "token" : "amit",
      "start_offset" : 5,
      "end_offset" : 9,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "foobar",
      "start_offset" : 10,
      "end_offset" : 16,
      "type" : "<ALPHANUM>",
      "position" : 2
    },
    {
      "token" : "getFooLabelFrombar",
      "start_offset" : 17,
      "end_offset" : 35,
      "type" : "<ALPHANUM>",
      "position" : 3
    },
    {
      "token" : "test",
      "start_offset" : 36,
      "end_offset" : 40,
      "type" : "<ALPHANUM>",
      "position" : 4
    },
    {
      "token" : "java",
      "start_offset" : 41,
      "end_offset" : 45,
      "type" : "<ALPHANUM>",
      "position" : 5
    },
    {
      "token" : "91",
      "start_offset" : 46,
      "end_offset" : 48,
      "type" : "<NUM>",
      "position" : 6
    }
  ]
}