Продолжая свой предыдущий пост, я изменил запрос, так как согласно femtoRgon вывешивают некоторые персонажи, а привязки не поддерживаются поиском с помощью эластичного поиска.
Я ищу способ сопоставить шаблон, похожий на "xxx-xx-xxxx", чтобы искать документы с номерами социального обеспечения, используя elastic search
.
Предположим, в индексированных документах мне бы хотелось найти все те документы, у которых есть номера социального страхования, которые соответствуют шаблону "xxx-xx-xxxx".
Пример кода для индексации документа:
InputStream is = null;
try {
is = new FileInputStream("/home/admin/Downloads/20121221.doc");
ContentHandler contenthandler = new BodyContentHandler();
Metadata metadata = new Metadata();
Parser parser = new AutoDetectParser();
parser.parse(is, contenthandler, metadata, new ParseContext());
}
catch (Exception e) {
e.printStackTrace();
}
finally {
if (is != null) is.close();
}
Пример кода для поиска
QueryBuilder queryBuilderFullText = null;
queryBuilderFullText = QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),
FilterBuilders.regexpFilter("_all", "[0-9]{3}?[0-9]{2}?[0-9]{4}"));
SearchRequestBuilder requestBuilder;
requestBuilder = client.prepareSearch()
.setIndices(getDomainIndexId(project))
.setTypes(getProjectTypeId(project))
.setQuery(queryBuilderFullText);
SearchResponse response = requestBuilder.execute().actionGet(ES_TIMEOUT_MS);
SearchHits hits = response.getHits();
if (hits.getTotalHits() > 0) {
System.out.println(hits.getTotalHits());
} else {
return 0l;
}
Я получаю хиты для следующих целей:
45-555-5462
457-55-5462
4578-55-5462
457-55-54623
457-55-5462-23
Но согласно моему требованию, он должен возвращать только "457-55-5462" (на основе соответствия шаблону "xxx-xx-xxxx").
Пожалуйста помоги.
Если вы не видите, как ^
, $
и \d
, я бы сделал следующее:
[^0-9-][0-9]{3}-[0-9]{2}-[0-9]{4}[^0-9-]
Или в Java:
FilterBuilders.regexpFilter("_all", "[^0-9-][0-9]{3}-[0-9]{2}-[0-9]{4}[^0-9-]"));
Который проверяет, что до или после найденного номера нет других чисел или тире. Это требует наличия какого-либо персонажа до и после матча, так что это не приведет к захвату документов, у которых номер социального страхования будет самым началом или очень концом.
FilterBuilder
с FilterBuilder
или другой частью elastic search
.
Вы забываете добавить -
раньше ?
в вашем регулярном выражении, а также при необходимости использовать якоря.
"[0-9]{3}-?[0-9]{2}-?[0-9]{4}"
ИЛИ
"^[0-9]{3}-?[0-9]{2}-?[0-9]{4}$"