У меня есть индекс упругости с документами, которые содержат поле «Источник». Граница на основе регулярного выражения
{"Source": "/Bob/Test/SomeDir/1.doc"},
{"Source": "/Steve/2.doc"},
{"Source": "/Steve/3.doc"},
{"Source": "/Steve/SomePath/4.doc"}
{"Source": "/Steve/SomeOther/5.doc"}
{"Source": "/Steve/SomeOther/6.doc"}
Предполагая, что источник not_analyzed
, я могу сделать:
{"query": {"wildcard": "/Steve/*"}}
Чтобы получить документы все Стива. Я хотел бы иметь возможность разбивать счет на , где они были.
Желаемый результат:
"/Steve/SomePath": 1,
"/Steve/SomeOther": 2,
"/Steve": 2 /*Nice to have, omitting this one would be fine*/
Итак, я пытаюсь использовать регулярное выражение огранки просто выбрать бит источник я хочу фасет. Я знаю, что это не самый эффективный способ, и у нас есть другая идея в конвейере, используя пользовательский токенизатор, но если я смогу получить простую рабочую версию на данный момент, мы можем улучшить ее позже.
{
"query": {
"wildcard": "/Steve/*"
},
"facets": {
"tag": {
"terms": {
"field": "OriginalURI",
"regex": "^\\/Steve\\/.*?\\/.*$",
"regex_flags": "DOTALL|UNICODE_CASE"
}
}
}
}
Я надеялся это будет фасет на все после того, как /Steve/
(при условии, что я могу указать, какой матч группы использовать). Фактически, он, по-видимому, применяется только как фильтр - должен ли быть включен источник в фасетке или нет - так что я получаю каждый уникальный источник со счетом 1
.
Я направляюсь по правой тропе? Если нет, то какой правильный/простой способ сделать это?
Я не знаю, первое дело о ElasticSearch (включая движок регулярных выражений, которые он использует), но если ваш фильтр идет по разным совпадениям полного регулярного выражения, и вы сопоставляете весь путь и имя файла (из-за якорей), конечно, вы получите количество 1. Следовательно, не совпадают имена файлов, а только путь: ' ^/Steve /.*?/ 'или даже лучше (если поддерживается),' ^/Steve/[^ /] * '. Кроме того, почему вы избегаете первых двух косых черт, но не третьего? –
@ m.buettner re: 3-й, вы правы, его следует избегать - скопируйте/вставьте ошибку из моих различных попыток. Я позабочусь о ваших предложениях, спасибо - как вы можете сказать, я еще не знаю, что такое regex-fu ... – Basic
[This] (http://www.regular-expressions.info/tutorial.html), должен довести вас до скорости. –