Один из способов сделать это с помощью Lucene вкуса регулярного exression запроса:
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html
"query": {
"regexp":{
"serviceOrderNo": "[0]*65"
}
}
Кроме того, запрос Строки запроса также поддерживает небольшой набор специальных символов, более ограниченный набор символов регулярного выражения, AS WELL AS. Люцинные регулярные выражения будут выглядеть так: https://www.elastic.co/guide/en/elasticsearch/reference/1.x/query-dsl-query-string-query.html
"query": {
"query_string": {
"default_field": "serviceOrderNo",
"query": "0*65"
}
}
Это довольно простые регулярные выражения, как говорят соответствует символ (ы), содержащийся в скобках [0]
или символ 0
неограниченное количество раз *
.
Если у вас есть возможность повторно проиндексировать или еще не проиндексировать ваши данные, у вас также есть возможность сделать это проще для себя, написав собственный анализатор. Прямо сейчас вы используете анализатор по умолчанию для строк в поле serviceOrderNo. Когда вы индексируете "serviceOrderNo":"00000065"
, ES интерпретирует это просто как 00000065.
Ваш пользовательский анализатор может подделать это поле как «0000065», так и «65», используя то же регулярное выражение. Преимущество этого заключается в том, что Regex работает только один раз во время индекса, а не каждый раз, когда вы запускаете свой запрос, потому что ES будет искать как «0000065», так и «65».
Вы также можете проверить the ES website documentation on Analyzers.
"settings":{
"analysis": {
"filter":{
"trimZero": {
"type":"pattern_capture",
"patterns":"^0*([0-9]*$)"
}
},
"analyzer": {
"serviceOrderNo":{
"type":"custom",
"tokenizer":"standard",
"filter":"trimZero"
}
}
}
},
"mappings":{
"serviceorderdto": {
"properties":{
"serviceOrderNo":{
"type":"String",
"analyzer":"serviceOrderNo"
}
}
}
}
Я просто понял, что я сделал действительно ленивую работу написания регулярных выражений для пользовательского анализатора. Я обновил свой ответ трижды проверенным преемником. – IanGabes
Я пробовал ваше решение, и это сработало. Благодаря!Я нахожусь на ранних этапах создания ES, поэтому я могу повторно индексировать, поэтому ваше решение работает хорошо. Я также опубликовал другой ответ, не уверенный, с кем мы еще будем. Если вы найдете какие-либо недостатки решения ngram, отправьте комментарий. –