Elasticsearch [обычный поиск] анализ и практика
Регулярный запрос
Regexp позволяет использовать регулярные выражения для терминальных запросов. Обратите внимание: если регулярное выражение используется неправильно, это приведет к серьезному снижению производительности сервера. Например, запрос, начинающийся с .*, будет соответствовать всем ключевым словам в инвертированном индексе, что почти эквивалентно полному сканированию таблицы и будет очень медленным. Поэтому, если возможно, лучше всего добавить соответствующий префикс перед использованием регулярного выражения. .*?
Если вы используете или в регулярном выражении, +
это снизит производительность запроса.
Примечание. Это запрос терминов, что означает, что этот запрос не может охватывать термины.
Приведите простой пример:
GET /_search
{
"query": {
"regexp":{
"name.first": "s.*y"
}
}
}
Некоторые стандартные варианты использования, поддерживаемые регулярными выражениями:
часть ключевого слова поиска
Если данный терминabcde
ab.* 可以匹配
abcd 不可以匹配
Он также поддерживает использование ^
или $
для указания начала или конца.
разрешены специальные символы
Некоторые специальные символы необходимо экранировать, например:
. ? + * | { } [ ] ( ) " \
Если вы хотите найти фиксированное слово, вы также можете добавить двойные кавычки.
соответствовать любому персонажу
.
Может соответствовать любому символу, например
ab...
a.c.e
Все они могут соответствовать abcde
соответствовать одному или нескольким
Использование +
означает соответствие одному или нескольким символам
a+b+ # match
aa+bb+ # match
a+.+ # match
aa+bbb+ # match
Все вышеперечисленное может совпадатьaaabbb
Совпадает с нулем или более
a*b* # match
a*b*c* # match
.*bbb.* # match
aaa*bbb* # match
Все вышеперечисленное может совпадатьaaabbb
соответствовать другому или одному
aaa?bbb? # match
aaaa?bbbb? # match
.....?.? # match
aa?bb? # no match
Все вышеперечисленное может совпадатьaaabbb
Поддержка количества совпадений
Используйте {}
поддержку для соответствия указанным интервалам минимального и максимального значений.
# repeat exactly 5 times
# repeat at least twice and at most 5 times
# repeat at least twice
Например, для строк:
a{3}b{3} # match
a{2,4}b{2,4} # match
a{2,}b{2,} # match
.{3}.{3} # match
a{4}b{4} # no match
a{4,6}b{4,6} # no match
a{4,}b{4,} # no match
Группа захвата
для строкиababab
(ab)+
ab(ab)+
(..)+
(...)+
(ab)*
abab(ab)?
ab(ab)?
(ab){3}
(ab){1,2}
оператор выбора
Поддерживает сопоставление операций ИЛИ. Обратите внимание, что по умолчанию здесь используется самое длинное совпадение.
aabb|bbaa # match
aacc|bb # no match
aa(cc|bb) # match
a+|b+ # no match
a+b+|b+a+ # match
a+(b|c)+ # match
соответствие символов
Поддерживает []
сопоставление символов в , ^
что означает отсутствие
[abc] # 'a' or 'b' or 'c'
[a-c] # 'a' or 'b' or 'c'
[-abc] # '-' or 'a' or 'b' or 'c'
[abc\-] # '-' or 'a' or 'b' or 'c'
[^abc] # any character except 'a' or 'b' or 'c'
[^a-c] # any character except 'a' or 'b' or 'c'
[^-abc] # any character except '-' or 'a' or 'b' or 'c'
[^abc\-] # any character except '-' or 'a' or 'b' or 'c'
Представленный диапазон -
совпадает.
необязательное средство сопоставления
Некоторые специальные операторы также поддерживаются в регулярных выражениях, и вы можете использовать поле флагов, чтобы контролировать, включены ли они.
Дополнить
Это означает, что регулярное выражение соответствует строке, например, ab~cd
это означает: начиная с a, затем b, затем несколько строк, отличных от C, и, наконец, заканчивая d. Например строкаabcdef
ab~df
ab~cf
ab~cdef
a~(cb)def
a~(bc)def
Интервал
Параметр интервала поддерживает диапазон значений, например строки foo80
:
foo<1-100> # match
foo<01-100> # match
foo<001-100> # no match
Пересечение
Используйте &
соединение, которое может обеспечить несколько совпадений, например строки aaabbb
:
aaa.+&.+bbb # match
aaa&bbb # no match
Любой
Используйте @
для сопоставления любой строки
упражняться
首先创建索引:
PUT test
然后创建映射:
PUT test/_mapping/test
{
"properties": {
"a": {
"type": "string",
"index":"not_analyzed"
},
"b":{
"type":"string"
}
}
}
添加一条数据:
PUT test/test/1
{
"a":"a,b,c","b":"a,b,c"
}
Давайте сначала разберем, a,b,c
что анализируется по умолчанию?
POST test/_analyze
{
: ,
:
}
返回内容:
{
: [
{
: ,
: 0,
: 1,
: ,
: 0
},
{
: ,
: 2,
: 3,
: ,
: 1
},
{
: ,
: 4,
: 5,
: ,
: 2
}
]
}
Затем запросите:
POST /test/test/_search?pretty
{
:{
:{
:
}
}
}
返回
{
: 2,
: false,
: {
: 5,
: 5,
: 0
},
: {
: 1,
: 1,
: [
{
: ,
: ,
: ,
: 1,
: {
: ,
:
}
}
]
}
}
Попробуйте изменить его на поле b:
POST /test/test/_search?pretty
{
"query":{
"regexp":{
"b": "a.*b.*"
}
}
}
返回
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
Почему это?
Поскольку весь запрос регулярного выражения применяется к одному слову, для поиска определенного слова a.*b.*
, поскольку поле a не сегментировано по словам, его слово является целым a.b.c
; поле b сегментировано, и его слова представляют собой три независимых слова: a
sum b
и he . c
Регулярный поиск по полю a может дать результаты, однако поиск по полю b невозможен.
Подводя итог, нам все еще необходимо хорошо понимать роль сегментации слов в поисковых системах.
OpenAI бесплатно открывает ChatGPT для всех пользователей. Голосовые программисты подделали балансы ETC и присвоили более 2,6 млн юаней в год. Официально выпущена Spring Boot 3.2.0. Сотрудники Google раскритиковали большого босса после ухода из компании. Он принимал активное участие в проект Flutter и сформулировал стандарты, связанные с HTML. Microsoft Copilot Web AI будет официально запущен 1 декабря и будет поддерживать китайскую веб-инфраструктуру Terminal Chat Rust от Microsoft с открытым исходным кодом. Rocket-версии v0.5: поддерживает асинхронный режим, SSE, WebSockets и т. д . Отец Redis реализует фреймворк Telegram Bot с использованием чистого кода языка C. Если вы являетесь сопровождающим проекта с открытым исходным кодом, столкнитесь с вопросом: «Как далеко вы сможете вынести такой ответ?» PHP 8.3 общедоступная версияЭта статья опубликована OpenWrite, блогом, в котором публикуется множество статей !