Поиск CamelCase с Elasticsearch

Я хочу настроить Elasticsearch, чтобы поиск «JaFNam» создавал хорошую оценку для «JavaFileName».

Я попытался создать анализатор, который объединяет анализатор CamelCase pattern с токенизатором edge_ngram. Я думал, что это создаст такие термины:

J F N Ja Fi Na Jav Fil Nam Java File Name

Но токенизатор, кажется, не имеет никакого эффекта: я продолжаю получать эти термины:

Java File Name

Как будет выглядеть правильная конфигурация Elasticsearch?


Пример кода:

curl -XPUT    'http://127.0.0.1:9010/hello?pretty=1' -d'
{
  "settings":{
    "analysis":{
      "analyzer":{
        "camel":{
          "type":"pattern",
          "pattern":"([^\\p{L}\\d]+)|(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)|(?<=[\\p{L}&&[^\\p{Lu}]])(?=\\p{Lu})|(?<=\\p{Lu})(?=\\p{Lu}[\\p{L}&&[^\\p{Lu}]])",
          "filters": ["edge_ngram"]
        }
      }
    }
  }
}
'
curl -XGET    'http://127.0.0.1:9010/hello/_analyze?pretty=1' -d'
{
  "analyzer":"camel",
  "text":"JavaFileName"
}'

приводит к:

{
  "tokens" : [ {
    "token" : "java",
    "start_offset" : 0,
    "end_offset" : 4,
    "type" : "word",
    "position" : 0
  }, {
    "token" : "file",
    "start_offset" : 4,
    "end_offset" : 8,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "name",
    "start_offset" : 8,
    "end_offset" : 12,
    "type" : "word",
    "position" : 2
  } ]
}

person slartidan    schedule 18.01.2017    source источник
comment
У вас может быть только один токенизатор, pattern или edge_ngram, но не оба одновременно. Кроме того, я не уверен, почему регистр символов должен иметь значение. Насколько это отличается от поиска JaFNam или jafnam?   -  person Val    schedule 18.01.2017
comment
@Val eclipse и IntelliJ IDE используют такую ​​​​интерпретацию случая. Они интерпретируют JaFNam и jafnam по-разному. Я хочу использовать то же поведение для моего поиска.   -  person slartidan    schedule 18.01.2017
comment
@Val Могу ли я использовать edge_ngram фильтр вместо токенизатора edge_ngram для достижения желаемого поведения?   -  person slartidan    schedule 18.01.2017
comment
да, есть еще фильтр edge_ngram, можешь попробовать   -  person Val    schedule 18.01.2017
comment
@Val К сожалению, я получаю те же результаты при использовании фильтра. Я обновил свой вопрос, чтобы использовать фильтр вместо токенизатора.   -  person slartidan    schedule 18.01.2017
comment
Определение вашего анализатора неверно. вам нужен tokenizer и массив filter, так как это ваш анализатор не работает.   -  person Val    schedule 18.01.2017


Ответы (1)


Определение вашего анализатора неверно. вам нужен tokenizer и массив filter, так как это ваш анализатор не работает. Вместо этого попробуйте следующее:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "camel": {
          "tokenizer": "my_pattern",
          "filter": [
            "my_gram"
          ]
        }
      },
      "filter": {
        "my_gram": {
          "type": "edge_ngram",
          "max_gram": 10
        }
      },
      "tokenizer": {
        "my_pattern": {
          "type": "pattern",
          "pattern": "([^\\p{L}\\d]+)|(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)|(?<=[\\p{L}&&[^\\p{Lu}]])(?=\\p{Lu})|(?<=\\p{Lu})(?=\\p{Lu}[\\p{L}&&[^\\p{Lu}]])"
        }
      }
    }
  }
}
person Val    schedule 18.01.2017
comment
О да, max_gram по умолчанию равно 2. я обновил свой ответ - person Val; 18.01.2017
comment
Круто, рад, что помогло! - person Val; 23.01.2017