2013-07-01 6 views
1

У меня есть индекс упругости с документами, которые содержат поле «Источник». Граница на основе регулярного выражения

{"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.

Я направляюсь по правой тропе? Если нет, то какой правильный/простой способ сделать это?

+1

Я не знаю, первое дело о ElasticSearch (включая движок регулярных выражений, которые он использует), но если ваш фильтр идет по разным совпадениям полного регулярного выражения, и вы сопоставляете весь путь и имя файла (из-за якорей), конечно, вы получите количество 1. Следовательно, не совпадают имена файлов, а только путь: ' ^/Steve /.*?/ 'или даже лучше (если поддерживается),' ^/Steve/[^ /] * '. Кроме того, почему вы избегаете первых двух косых черт, но не третьего? –

+0

@ m.buettner re: 3-й, вы правы, его следует избегать - скопируйте/вставьте ошибку из моих различных попыток. Я позабочусь о ваших предложениях, спасибо - как вы можете сказать, я еще не знаю, что такое regex-fu ... – Basic

+0

[This] (http://www.regular-expressions.info/tutorial.html), должен довести вас до скорости. –

ответ

4

Вы можете извлечь ту часть, которую вы хотели бы фасет на использование термина скрипта:

curl -XGET 'localhost:9200/test/_search?pretty=true' -d '{ 
    "query": { 
    "wildcard": {"OriginalURI": "/Steve/*"} 
    }, 
    "facets": { 
    "tag": { 
     "terms": { 
     "field": "OriginalURI", 
     "script": "term.replaceAll(\"(\\\\/[^\\\\/]+)$\", \"\")" 
     } 
    } 
    } 
}' 
+0

Спасибо, я дам это завтра, и прокомментирую еще раз. – Basic

+0

Привет, Игорь, я могу найти документацию по поддерживаемому синтаксису скрипта? Я посмотрел через mvel, и replaceAll, похоже, не там. –

+0

Термин - это просто строка Java. Итак, вам нужно проверить [java API spec] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html) – imotov

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