Как искать как числа, так и мое слово, используя встроенный или настраиваемый анализатор в упругом поиске

Этот вопрос является продолжением моего предыдущего вопроса. У меня есть текст, по которому я хочу выполнить поиск как по цифрам, так и по тексту.

Мой текст: -

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

И я хочу искать на getFooLabelFrombar, fooBar, 8080 а также 91,

Ранее я использовал 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 из которых, поиск по foobar а также getFooLabelFrombar давал результат поиска, но не 8080 а также 91, так как простой анализатор не токенизирует числа.

Тогда, как предложено в пред. ТАК сообщение, я изменил анализатор на 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 ответ

Решение

Как насчет использования символьного фильтра для замены точек пробелами?

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
    }
  ]
}
Другие вопросы по тегам