Solr / Lucene - запрос префикса для строк, заканчивающихся числовым значением - PullRequest
0 голосов
/ 14 ноября 2018

Я замечаю поведение, которое не могу объяснить в solr (версия 7.5).У меня есть два документа, каждый из которых содержит поле с полным путем к файлу.

doc1: {
    path: ["/home/kyle/filea.txt"]
},
doc2: {
    path: ["/home/kyle/file1.txt"]
}
  • Если я задаю запрос: path:filea.*, doc1 возвращается правильно.
  • Если я выдаю запрос: path:file1*, doc2 возвращается правильно.
  • Если я задаю запрос: path:"file1.*", doc2 возвращается правильно.
  • Если я выдаю запрос: path:file1.*, doc2 НЕ возвращается.

У меня есть TokenizerChain по умолчанию в Index Analyzer и Query Analyzer, и поле имеет многозначное значение.

Итак, мой вопрос: что делает solr / lucene за кулисами, что вызывает запрос:

  • <string><number>.*

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

  • <string>.* (без конечного числа),
  • <string><number>* (без точки в запросе)
  • "<string><number>.*" (запрос в кавычках)

все возвращают то, что я думаю, они должны?

1 Ответ

0 голосов
/ 14 ноября 2018

Ваш анализатор разбивает строки на токены в соответствии с правилами, указанными в UAX # 29 . Интересующие нас правила: WB6 - WB12. Он не будет разбивать группы букв за период (например, сокращение) или группы цифр (например, десятичное число), но буква, за которой следует цифра (или наоборот), будет разбита.

То есть:

  • "one.two" становится одним токеном: "one.two". В doc1 вы получите токен: "filea.txt"
  • «1.2» становится одним токеном: «1.2»
  • «one.2» становится двумя токенами: «one» и «2». В doc2 вы получаете токены: «file1» и «txt»
  • «1. два» становится двумя токенами: «1» и «два»

Другая вещь, которую нужно понять, это то, что подстановочные запросы не являются токенизированными, поэтому они не найдут шаблоны, которые после анализа будут охватывать два токена или, в данном случае, символы, которые будут исключены при токенизации.

Итак, ваши запросы:

  • path:filea.* ищет "filea". в качестве префикса. Он находит его, потому что «filea.txt» является токеном, присутствующим в индексе.
  • path:file1* ищет "file1" в качестве префикса. Он находит его, потому что "" file1 "является токеном в индексе.
  • path:"file1.*" - это запрос фразы, и в запросах фраз нет подстановочных знаков. Таким образом, «file1. *» Проходит через анализ, который устраняет пунктуацию, и становится «file1», который он находит в индексе.
  • path:file1.* ищет "file1". в качестве префикса. «file1» и «txt» находятся в индексе, но «file1». нет, поэтому ничего не находит.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...