2015-09-29 4 views
0

Я создал регистрозависимость анализатор, какУпругое поле поиска сортировать, содержащее специальные символы и цифру alpahbets

PUT /dhruv3 
{ 
    "settings": { 
    "index": { 
     "analysis": { 
     "analyzer": { 
      "analyzer_keyword": { 
      "tokenizer": "keyword", 
      "filter": [ "lowercase", "asciifolding" ] 
      } 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "test": { 
     "properties": { 
     "about": { 
      "type": "string", 
      "analyzer": "analyzer_keyword" 
     }, 
     "firsName": { 
      "type": "string" 
     } 
     } 
    } 
    } 
} 

и использовал ее в отображении. О поле должно содержать Aplha numerc и специальный characters.Then я вставил несколько значений с about поле

1234, `приятелем, приятель, ~ приятелем

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

GET dhruv/test/_search 
{ 
    "sort": [ 
    { 
     "about": { 
     "order": "asc" 
     } 
    } 
    ] 
} 

Я получаю результаты в о поле как

1234, `приятелем, приятель, ~ дружок

. Но я ожидаю, что они станут первыми специальными персонажами, а затем цифрами, а затем алфавитами.

Я сделал некоторые домашние работы и узнал, что это из-за их значений ASCII. Я искал интернет и пытался даже asciifolding. Но не получилось. Я знаю, что есть какое-то решение, но я не могу понять. Прошу вас, направьте меня

+0

Проверьте, что делает этот анализатор для вашего текста, используя конечную точку [_analyze endpoint] (https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-analyze.html). Я думаю, что последние три будут рассматриваться как «приятель». Вам не нужен анализ, кроме фильтра символов, например [Mapping Char Filter] (https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-mapping-charfilter.html), чтобы вы может сопоставить специальные символы с тем, что гарантирует, что такая строка будет первой. – eemp

ответ

2

Вы правы в том, что поведение сортировки, которое вы видите, связано с тем, что значение ASCII специальных символов больше, чем значение ASCII цифр. Чтобы быть точным, глядя на ASCII table, мы имеем следующие значения:

  • 1 имеет значение ASCII 49
  • `имеет значение ASCII 96
  • p имеет значение ASCII 112
  • ~ имеет значение ASCII 126

asciifolding token filter просто преобразует символы и цифры NOT в таблице ASCII (т.е. первые 127 символов) в их эквивалент ASCII, если таковой существует (например, é, è, ë, ê преобразуются в e). Поскольку все символы, приведенные выше, находятся в таблице ASCII, это не то, что вы ищете.

Если вы хотите, чтобы специальные символы выходили первым в поиске, есть несколько способов.

Один из способов достичь этого просто отрицать их значение ASCII, так что они всегда будут приходить до ASCII символ 0, а затем использовать сценарий сортировки:

{ 
    "sort": [ 
    { 
     "_script": { 
     "script": "return doc['about'].value.chars[0].isLetterOrDigit() ? 1 : -1", 
     "type": "number", 
     "order": "asc" 
     } 
    } 
    ] 
} 
1

asciifolding не имеет ничего общего с тем, что вам» пытаюсь добиться. В ASCIIFoldingFilter.java имеется множество информации, он просто декодирует символы Unicode, такие как \uFF5E, на его эквивалент ASCII в случае, если можно предоставить альтернативу.

Добавление @ ответ Вэл, в случае, если вы хотите, значения сортируются в порядке специальных символов затем цифры, а затем алфавиты, вы можете рассмотреть вопрос об использовании -

GET /ascii/test/_search 
{ 
    "sort": { 
    "_script": { 
     "script": "r = doc['about'].value.chars[0]; return !r.isLetter() ? r.isDigit() ? 1 : -1 : 2", 
     "type": "number", 
     "order": "asc" 
    } 
    } 
} 

Также обратите внимание на эту сортировку не может быть так как мы только позаботились о первом символе в сценарии. Возможно, вы захотите написать надежный скрипт, который заботится о целом значении.

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

Смежные вопросы