Elasticsearch [обычный поиск] анализ и практика

17126607:

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 сегментировано, и его слова представляют собой три независимых слова: asum bи he . cРегулярный поиск по полю a может дать результаты, однако поиск по полю b невозможен.

Подводя итог, нам все еще необходимо хорошо понимать роль сегментации слов в поисковых системах.

Эта статья опубликована OpenWrite, блогом, в котором публикуется множество статей !

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 общедоступная версия
{{o.name}}
{{м.имя}}

おすすめ

転載: my.oschina.net/u/5587102/blog/10142892