Lucene NOT_ANALYZED не работает с прописными буквами

Я построил индекс с помощью StandardAnalyzer, в этом индексе есть несколько полей. Например, представьте, что у него есть идентификатор и тип. Оба NON_ANALYZED, то есть вы можете искать их только как есть.

В моем указателе есть несколько записей:

 {Id: "1", Type: "Location"},
 {Id: "2", Type: "Group"},
 {Id: "3", Type: "Location"}

Когда я ищу +Id:1 или любое другое число, я получаю соответствующий результат (опять же с помощью StandardAnalyzer).

Однако, когда я ищу +Type:Location или +Type:Group, я не получаю никаких результатов. Странно то, что когда я включаю начальные подстановочные знаки, +Type:*ocation действительно возвращает результаты! +Type:*Location или другие комбинации - нет.

Это заставило меня поверить, что индексатор/запрос не любит символы в верхнем регистре! После преобразования Type в нижний регистр до location и group перед их индексацией я мог искать их как таковые.

Если я изменю поле «Тип» на «АНАЛИЗ», оно будет работать практически с любым поиском (прописные/строчные буквы и т. д.), но я хочу запросить поле «Тип» как есть.

Я совершенно сбит с толку, почему он это делает. Может ли кто-нибудь объяснить мне, почему мой индексатор не позволяет мне искать поля NON_ANALYZED, в значении которых есть заглавная буква?


person Lennard Fonteijn    schedule 18.01.2016    source источник


Ответы (1)


Используете ли вы StandardAnalyzer при анализе строки запроса (+Type:Location)? StandardAnalyzer будет переводить все термины в нижний регистр, поэтому на самом деле вы выполняете поиск с помощью +Type:location.

Всегда используйте один и тот же анализатор при поиске и индексировании. Изучите использование PerFieldAnalyzer и установите поле Type для использования KeywordAnalyzer.

person sisve    schedule 18.01.2016
comment
Я использовал StandardAnalyzer как для индекса, так и для QueryParser, но это странная часть. Разве QueryParser не просматривает сам индекс, чтобы определить, действительно ли он должен использовать StandardAnalyzer? Я понял, что NOT_ANALYZED означает, что анализирующая часть пропускается во время индексации, и я предположил, что когда я запрашиваю поле с этим набором, он снова делает то же самое. Но, видимо, это не так. - person Lennard Fonteijn; 19.01.2016
comment
Когда вы думаете об этом; как QueryParser мог знать что-либо об индексе, не имея IndexReader? - person sisve; 19.01.2016
comment
Совершенно верно... Как я могу сказать моему парсеру запросов, что одно поле НЕ АНАЛИЗИРОВАНО и должно относиться к нему как к таковому, если это вообще возможно? - person Lennard Fonteijn; 19.01.2016
comment
Еще лучше, как я могу сказать QueryParser рассматривать определенную нотацию как TermQuery - в основном искать как есть? Я пытался использовать [Местоположение], так как это казалось наиболее разумным, но он этого не понимает. - person Lennard Fonteijn; 19.01.2016
comment
Пробовали ли вы использовать PerFieldAnalyzer и KeywordAnalyzer для поля Type? - person sisve; 19.01.2016
comment
Да, это работает, и, вероятно, это правильный путь, поскольку я не очень хочу писать свой собственный анализатор запросов: P. Мне просто интересно, может ли QueryParser иметь нотацию для поиска чего-то как есть, без анализа. - person Lennard Fonteijn; 19.01.2016