У меня есть метод получения списка, который я хочу проиндексировать (токенизировать) в несколько полей.
У меня есть реализация FieldBridge, которая выполняет итерацию по списку и индексирует каждую строку в поле с индексом, добавленным к имени поля, чтобы дать каждому другому имя.
У меня есть две разные реализации анализатора (CaseSensitiveNGramAnalyzer и CaseInsensitiveNGramAnalyzer), которые я хочу использовать с этим FieldBridge (для создания индекса поля с учетом регистра и без учета регистра).
Это FieldBridge, к которому я хочу применить анализаторы:
public class StringListBridge implements FieldBridge
{
@Override
public void set(String name, Object value, Document luceneDocument, LuceneOptions luceneOptions)
{
List<String> strings = (List<String>) value;
for (int i = 0; i < strings.size(); i++)
{
addStringField(name + 1, strings.get(i), luceneDocument, luceneOptions);
}
}
private void addStringField(String fieldName, String fieldValue, Document luceneDocument, LuceneOptions luceneOptions)
{
Field field = new Field(fieldName, fieldValue, luceneOptions.getStore(), luceneOptions.getIndex(), luceneOptions.getTermVector());
field.setBoost(luceneOptions.getBoost());
luceneDocument.add(field);
}
}
- Можно ли применить анализатор к полю, в котором используется FieldBridge?
- Если да, то можно ли это сделать с помощью аннотаций или нужно делать программно?
- Если второе, могу ли я ввести анализатор в качестве параметра?
Я думаю о следующем, но совсем не знаком с потоками полевых токенов и т. Д .:
private void addStringField(String fieldName, String fieldValue, Document luceneDocument, LuceneOptions luceneOptions)
{
Field field = new Field(fieldName, fieldValue, luceneOptions.getStore(), luceneOptions.getIndex(), luceneOptions.getTermVector());
field.setBoost(luceneOptions.getBoost());
try
{
field.setTokenStream(new CaseSensitiveNGramAnalyzer().reusableTokenStream(fieldName, new StringReader(fieldValue)));
}
catch (IOException e)
{
e.printStackTrace();
}
luceneDocument.add(field);
}
Это разумный подход?
РЕДАКТИРОВАТЬ. Я попытался указать Analyzer и FieldBridge в аннотации @Field (без включения приведенного выше кода анализатора) следующим образом, но похоже, что он использует анализатор по умолчанию, а не те, которые указаны с помощью analyzer =
.
@Fields({
@Field(name="content-nocase",
index = Index.TOKENIZED,
analyzer = @Analyzer(impl = CaseInsensitiveNgramAnalyzer.class),
bridge = @FieldBridge(impl = StringListBridge.class)),
@Field(name = "content-case",
index = Index.TOKENIZED,
analyzer = @Analyzer(impl = CaseSensitiveNgramAnalyzer.class),
bridge = @FieldBridge(impl = StringListBridge.class)),
})
public List<String> getContents()