Lucene - поиск нескольких связанных значений - PullRequest
0 голосов
/ 18 мая 2018

Я бы хотел проиндексировать и найти фрагменты данных, которые проиндексированы с помощью Lucene.

Например, элементы и их цвет

Item 1 - Black
Item 2 - Yellow
Item 3 - Red

Примеры поиска

Поисковое слово - Item

Item 1 - Black
Item 2 - Yellow
Item 3 - Red

Поисковое слово - Item 1

Item 1 - Black

Поисковое слово - Item 2 - Yellow

Item 2 - Yellow

Возможное решение

Из того, что я нашел в ответе на this , очевидно, я могу добавить их в поле, используя этот формат.

// {Item 1}|{Black}
document.add(new StringField("item", MessageFormat.format("'{'{0}'}'|'{'{1}'}'", itemName, itemColour, Field.Store.YES));

Если я сейчас выполню поиск по данным в этом формате, я не получу результатов.

Я использую StandardAnalyzer.

Вот как я создаю запрос.

QueryParser queryParser = new QueryParser("item", analyzer);
queryParser.setAllowLeadingWildcard(true);
Query query = queryParser.parse(keyword);

Я хочу найти:

  1. Все предметы, которые имеют совпадающее имя
  2. Все предметы, которые совпадают и имеют определенный цвет

Каков наилучший метод решения этой проблемы?

1 Ответ

0 голосов
/ 18 мая 2018

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

new StringField("number", number);
new StringField("item", item);
new StringField("color", color);

дополнительно к этим 3 полям вы добавляете поле для полнотекстового поиска, включающее всю информацию из трех полей.Это будет сделано TextField См. Lucene Field javadoc

new TextField("fulltext", item + " " + number + " " + "color");

. Таким образом, вы сможете применить свой полнотекстовый поиск к полю "fulltext" и, возможно, некоторые другие поискинепосредственно к другим полям.

И последнее:

queryParser.setAllowLeadingWildcard (true);

Вы действительно хотите это разрешить?это может повлиять на производительность и привести к неожиданному поведению при поиске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...