ElasticSearch поиск специальных символов с помощью анализатора шаблонов

В настоящее время я использую специальный анализатор, в котором в качестве токенизатора задан шаблон (\W|_)+ Таким образом, каждый термин состоит только из букв и разбивается на любую не букву. В качестве примера у меня есть документ с содержанием [dbo].[Material_Get] и другой с dbo.Another_Material_Get. Я хочу иметь возможность искать «Material_Get» и использовать оба документа, но если я введу поиск «[Material_Get]», он все равно попадет в dbo.Another_Material_Get, даже если в нем нет скобок. Также, если я ищу «Material Get» (в поиске с цитированием), я не должен получать никаких совпадений, поскольку ни один из них не содержит этой фразы.

Я мог бы согласиться на анализатор / токенизатор, который бы находил, когда есть входная строка где-нибудь в файле, даже если рядом с ней есть другие вещи. Например, поиск «aterial_get» будет соответствовать обоим. Можно ли выполнить любой из моих случаев?


person Nived    schedule 13.05.2015    source источник


Ответы (1)


Из того, что вы объяснили, я понял, что вы хотите выполнять частичные совпадения, также как поиск «aterial_get».

Чтобы удовлетворить все ваши требования, вам необходимо изменить отображение вашего поля, чтобы иметь фильтр токенов ngram в анализаторе и без удаления специальных символов. Анализатор проб может выглядеть так:

{
  "settings":{
    "analysis":{
      "analyzer":{
        "partialmatch":{
          "type":"custom",
          "tokenizer":"keyword",
          "filter":[ "lowercase", "ngram" ] 
        }
      },
      "filter":{
        "ngram":{
          "type":"ngram",
          "min_gram":2,
          "max_gram":15
        }
      }
    }
  }
}

И определите в вашем отображении для your_field анализатора "частичное совпадение", определенное выше. Вы можете изменить значения min_gram и max_gram в соответствии с вашими потребностями.

С помощью этого сопоставления вы можете выполнять обычный поиск терминов, как показано ниже

{
    "term": {
        "your_field": "aterial_get"
    }
}
person Prabin Meitei    schedule 13.05.2015
comment
Говорит ли max_gram из 15, что если бы частичный поиск длился дольше 15, он не работал бы? Также есть простой способ сделать это анализатором для всех полей? - person Nived; 13.05.2015
comment
Насколько медленным будет поиск большого объема большого документа? - person Nived; 13.05.2015
comment
max_gram 15 означает, что токены будут сгенерированы до максимальной длины 15. Таким образом, поиск длиннее 15 не будет работать. Вы можете установить один и тот же анализатор для всех полей, но это не рекомендуется. Для больших текстов размер индекса существенно увеличится, что повлияет на производительность поиска. Но опять же, это зависит от того, сколько у вас оборудования и документов. Ведь это и есть токены в инвертированном индексе. Обычно ngram / edgengram используется в полях меньшего размера для поиска типа автозаполнения. - person Prabin Meitei; 13.05.2015
comment
Проблема, которую я замечаю прямо сейчас, заключается в том, что если у меня был один документ с Material_Get, а другой - только со словом at, и я ищу атериал, я попадаю в оба документа, которые мне не нужны. - person Nived; 13.05.2015
comment
если вы используете term search, вы не получите оба документа. Если вы выполняете поиск типа query_string и не определили анализатор поиска, входные данные будут проанализированы так же, как и ваше поле (ngram), следовательно, будут соответствовать обоим. - person Prabin Meitei; 13.05.2015
comment
Хорошо, последний вопрос. Мне интересно, есть ли такой способ индексирования: Given [dbo]. [Material_Get] tokenize в токены [, dbo,],., Material_get,] ... В основном строки непрерывных символов 1 токен и любой отдельный не письмо жетон? - person Nived; 13.05.2015
comment
Также, если я выполняю поиск в кавычках \ [dbo]. [Material_get] \, он не возвращает результат, который должен - person Nived; 13.05.2015
comment
Для токенизации так, как вы хотите, вы можете использовать токенизатор шаблона с шаблоном вроде ((?<=[^a-zA-Z])|(?=[^a-zA-Z])). Что касается поиска по цитатам, если вы выполняли поиск по терминам, он не будет работать, поскольку вводимые данные для поиска по терминам не анализируются, и у вас нет документов с кавычками. Если вы дадите полную информацию о своем варианте использования, может быть, лучшее решение. - person Prabin Meitei; 13.05.2015