Схема моего эластичного поиска выглядит следующим образом:
{
"settings": {
"index": {
"number_of_shards": "5",
"number_of_replicas": "1"
}
},
"mappings": {
"node": {
"properties": {
"field1": {
"type": "keyword"
},
"field2": {
"type": "keyword"
},
"query": {
"properties": {
"regexp": {
"properties": {
"field1": {
"type": "keyword"
},
"field2": {
"type": "keyword"
}
}
}
}
}
}
}
}
}
Проблема в следующем:
Я формирую запросы ES с помощью elasticsearch_dsl Q (). Он отлично работает в большинстве случаев, когда мой запрос содержит любое сложное регулярное выражение. Но он полностью не работает, если он содержит символ регулярного выражения '!' в этом. Это не дает никакого результата, если поисковый запрос содержит "!" в этом.
Например:
1.) Q('regexp', field1 = "^[a-z]{3}.b.*") (отлично работает)
2.) Q('regexp', field1 = "^f04.*") (отлично работает)
3.) Q('regexp', field1 = "f00.*") (отлично работает)
4.) Q('regexp', field1 = "f04baz?") (отлично работает)
Не работает в следующем случае:
5.) Q('regexp', field1 = "f04((?!z).)*") (не работает без каких-либо результатов)
Я попытался добавить "анализатор": "ключевое слово" вместе с "тип": "ключевое слово", как указано выше, в поля, но в этом случае ничего не работает.
В браузере я попытался проверить, как будет работать анализатор: ключевое слово с вводом в случае сбоя:
http: // localhost: 9210 / search / _analyze? analyzer = keyword & text = f04 ((?! z).) *
Кажется, здесь все выглядит нормально с результатом:
{
"tokens": [
{
"token": "f04((?!z).)*",
"start_offset": 0,
"end_offset": 12,
"type": "word",
"position": 0
}
]
}
Я выполняю свои запросы, как показано ниже:
search_obj = Search(using = _conn, index = _index, doc_type = _type).query(Q('regexp', field1 = "f04baz?"))
count = search_obj.count()
response = search_obj[0:count].execute()
logger.debug("total nodes(hits):" + " " + str(response.hits.total))
Пожалуйста, помогите, это действительно неприятная проблема, так как все символы регулярных выражений работают нормально во всех запросах, кроме!.
Кроме того, как я могу проверить, какой анализатор в настоящее время применяется с вышеуказанной настройкой в моих сопоставлениях?
Ваше пятое регулярное выражение уже утверждает это. В ElasticSearch есть нюанс, которого я не знаю. Но я проголосовал за ваш вопрос в надежде, что кто-то еще сможет вам помочь.
Он был опубликован несколько дней назад, я не получаю никакой помощи по этому поводу. Спасибо
@TimBiegeleisen; я просто пытался сделать что-то вроде этого ^ (f04ba) [^ z] +? $ вместо этого f04 ((?! z).) *, чтобы избежать ответов с z; и это сработало. Дает ли эта штука какой-нибудь намек на то, почему! в запросе регулярного выражения не дает результатов?
@ wiktor-stribiżew, пожалуйста, помогите с этим вопросом?
@ WiktorStribiżew. вы можете помочь с этим вопросом плз?
@ WiktorStribiżew; похоже, вы решили это -> stackoverflow.com/questions/38645755/…; как мне решить то же самое в моем случае?
Эм, попробуйте изменить "f04((?!z).)*" на "f04[^z]*", поскольку кажется, что регулярное выражение просто соответствует строке, начинающейся с f04, а затем 0 или более символов, кроме z.
Да, но я хочу знать, что поисковые запросы не поддерживаются в эластичном поиске, верно? ; поэтому я попытался записать это "f04 ((?! z).) *" в ". * f04. * & ~ (. * z. *)" следующим вопросом -> stackoverflow.com/questions/38645755/…; это правильно?
@ WiktorStribiżew также, как вы сказали, похоже, что он соответствует только строке с f04, но на самом деле это не так; я не получаю никаких результатов. Может быть причина в том, что поисковые запросы не поддерживаются в ES?
В регулярном выражении ElasticSearch (движок Lucene) поисковые запросы не поддерживаются. Кстати, .*f04.*&~(.*z.*) соответствует сильному, имеющему f04, но не имеющему z внутри строки. Что вам на самом деле нужно?
Правильно, я хочу именно это ->. * F04. * & ~ (. * Z. *)
Ваш ответ stackoverflow.com/questions/38645755/… помог мне придумать это решение. Спасибо, сэр





Механизм регулярных выражений ElasticSearch Lucene не поддерживает поисковые запросы любого типа. Документация по регулярным выражениям ES довольно двусмысленно, говоря сопоставление всего, например .*, очень медленное, а также использование регулярных выражений поиска (что не только неоднозначно, но и неверно, поскольку поисковые запросы при разумном использовании могут значительно ускорить сопоставление регулярных выражений).
Поскольку вы хотите сопоставить любую строку, содержащую f04 и не содержащую z, вы можете использовать
[^z]*fo4[^z]*
Подробности
[^z]* - любые символы 0+, кроме zfo4 - подстрока fo4[^z]* - любые символы 0+, кроме z.Если у вас есть строка с несколькими символами, которую нужно «исключить» (скажем, z4, а не z), вы можете использовать свой подход, используя оператор дополнения:
.*f04.*&~(.*z4.*)
Это означает почти то же самое, но не поддерживает разрывы строк:
.* - любые символы, кроме новой строки, как можно большеf04 - f04.* - любые символы, кроме новой строки, как можно больше& - И~(.*z4.*) - любая строка, кроме той, которая имеет z4Можете ли вы также указать, что ES не поддерживает поисковые запросы в регулярном выражении. Это явно нигде не упоминается в документации ED dsl.
Поддерживает ли ElasticSearch поисковые обходы в синтаксисе регулярных выражений?