2014-11-22 5 views
0

Я использую следующий анализатор:Обработка специальных символов в elasticsearch

curl -XPUT 'http://localhost:9200/sample/' -d ' 
{ 
    "settings" : { 
    "index": { 
    "analysis": { 
     "analyzer": { 
     "default": { 
     "type": "custom", 
     "tokenizer": "keyword", 
     "filter": ["trim", "lowercase"]} 
     } 
    } 
    } 
    } 
}' 

Затем, когда я пытаюсь вставить некоторые документы, которые содержат специальные символы, такие как% и т.д., он преобразует в шестнадцатеричный.

1%2fPJJP3JV2C24iDfEu9XpHBaYxXh%2fdHTbmchB35SDznXO2g8Vz4D7GTIvY54iMiX_149c95f02a8 -> фактическое значение

1%2fPJJP3JV2C24iDfEu9XpHBaYxXh%2fdHTbmchB35SDznXO2g8Vz4D7GTIvY54iMiX_149c95f02a8 

-> сохраненное значение.

Пример:

curl -XPUT 'http://localhost:9200/sample/strom/1' -d '{ 
    "user" : "user1", 
    "message" : "1%2fPJJP3JV2C24iDfEu9XpHBaYxXh%2fdHTbmchB35SDznXO2g8Vz4D7GTIvY54iMiX_149c95f02a8" 
}' 

Проблема началась происходит только после того, как данные пересекла несколько миллионов документов. Раньше он использовал его как есть.

Теперь, если я пытаюсь найти, используя,

1%2fPJJP3JV2C24iDfEu9XpHBaYxXh%2fdHTbmchB35SDznXO2g8Vz4D7GTIvY54iMiX_149c95f02a8 

не в состоянии получить документ. Как мне с этим справиться? Поведение кажется недетерминированным в преобразовании специального символа в гекс.

Я не могу воспроизвести эту же проблему на localmachine.

Может кто-нибудь объяснить ошибку, которую я делаю?

ответ

0

Это не как документ лексемы на моем конце with that analyzer:

curl -XGET localhost:9200/_analyze?tokenizer=keyword\&filters=trim,lowercase\&pretty -d '1%2fPJJP3JV2C24iDfEu9XpHBaYxXh%2fdHTbmchB35SDznXO2g8Vz4D7GTIvY54iMiX_149c95f02a8' 
{ 
    "tokens" : [ { 
    "token" : "1%2fpjjp3jv2c24idfeu9xphbayxxh%2fdhtbmchb35sdznxo2g8vz4d7gtivy54imix_149c95f02a8", 
    "start_offset" : 0, 
    "end_offset" : 80, 
    "type" : "word", 
    "position" : 1 
    } ] 
} 

Чтение выходного сигнала анализатора выше, ваш пример текст преобразуется в один строчной но-иначе идентичный знак данного показанный анализатор. Вы уверены, что в игре нет фильтра символов? Именно это и сделает HTML-кодирование.

Вы должны быть в состоянии запустить его как:

curl -XGET localhost:9200/sample/_analyze?field=message' -d 'text to analyze' 

Поскольку не воспроизводя с анализатором непосредственно, я пытался воспроизвести это на моем конце, создав индекс, чтобы проверить его:

curl -XPUT localhost:9200/indexed-analysis -d ' 
{ 
    "settings": { 
    "number_of_shards" : 1, 
    "number_of_replicas" : 0, 
    "index": { 
     "analysis": { 
     "analyzer": { 
      "default": { 
      "type": "custom", 
      "tokenizer": "keyword", 
      "filter": ["trim", "lowercase"] 
      } 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "indexed" : { 
     "properties": { 
     "text" : { "type" : "string" } 
     } 
    } 
    } 
}' 

curl -XPUT localhost:9200/indexed-analysis/indexed/1 -d '{ 
    "text" : 
    "1%2fPJJP3JV2C24iDfEu9XpHBaYxXh%2fdHTbmchB35SDznXO2g8Vz4D7GTIvY54iMiX_149c95f02a8" 
}' 

curl -XGET localhost:9200/indexed-analysis/indexed/1?pretty 

Это произвело правильно, идентичный результат:

{ 
    "_index" : "indexed-analysis", 
    "_type" : "indexed", 
    "_id" : "1", 
    "_version" : 1, 
    "found" : true, 
    "_source":{ 
    "text" : "1%2fPJJP3JV2C24iDfEu9XpHBaYxXh%2fdHTbmchB35SDznXO2g8Vz4D7GTIvY54iMiX_149c95f02a8" 
    } 
} 

Итак, я попробовал _search для этого, и я нашел его соответствующим образом.

curl -XGET localhost:9200/indexed-analysis/_search -d '{ 
    "query": { 
    "match": { 
     "text": "1%2fPJJP3JV2C24iDfEu9XpHBaYxXh%2fdHTbmchB35SDznXO2g8Vz4D7GTIvY54iMiX_149c95f02a8" 
    } 
    } 
}' 

Результат:

{ 
    "took": 5, 
    "timed_out": false, 
    "_shards": { 
     "total": 1, 
     "successful": 1, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 1, 
     "max_score": 0.30685282, 
     "hits": [ 
     { 
      "_index": "indexed-analysis", 
      "_type": "indexed", 
      "_id": "1", 
      "_score": 0.30685282, 
      "_source": { 
       "text": "1%2fPJJP3JV2C24iDfEu9XpHBaYxXh%2fdHTbmchB35SDznXO2g8Vz4D7GTIvY54iMiX_149c95f02a8" 
      } 
     } 
     ] 
    } 
} 

Все это приводит к трем возможностям:

  1. Ваш поиск анализатор отличается от анализатора индекса. Это почти всегда приведет к неожиданным результатам.

    Использование default должно заставить его использовать для чтения и записи, но вы можете/должны убедиться в том, что на самом деле используется (в отличие от default_index или default_search):

    • curl -XGET /sample/_settings
    • curl -XGET /sample/_mapping

    Если вы видите, что анализаторы сконфигурированы при сопоставлении поля message, то, вероятно, это должен быть красный флаг.

  2. У вас есть символьный фильтр, возившийся с индексированной строкой (и это, вероятно, не делает то же самое для вашей строки поиска, тем самым указывая на # 1).

  3. В версии Elasticsearch есть ошибка, которую вы используете (надеюсь, нет, но вы никогда не знаете). Все вышеприведенные тесты были выполнены против версии 1.3.2.
Смежные вопросы