Я использую Lucene.NET 4.8-beta00005.
В моих документах есть поле "имя", определенное следующим образом:
doc.Add(CreateField(NameField, entry.Name.ToLower()));
writer.AddDocument(doc);
Где CreateField
реализовано следующим образом
private static Field CreateField(string fieldName, string fieldValue)
{
return new Field(fieldName, fieldValue, new FieldType() {IsIndexed = true, IsStored = true, IsTokenized = true, StoreTermVectors = true, StoreTermVectorPositions = true, StoreTermVectorOffsets = true, StoreTermVectorPayloads = true});
}
Поле "имя" присваивается StandardAnalyzer
.
Тогда в моем CustomScoreProvider
я получаю термины из термина вектор следующим образом:
private List<string> GetDocumentTerms(int doc, string fieldName)
{
var indexReader = m_context.Reader;
var termVector = indexReader.GetTermVector(doc, fieldName);
var termsEnum = termVector.GetIterator(null);
BytesRef termBytesRef;
termBytesRef = termsEnum.Next();
var documentTerms = new List<string>();
while (termBytesRef != null)
{
//removing trailing \0 (padded to 16 bytes)
var termText = Encoding.Default.GetString(termBytesRef.Bytes).Replace("\0", "");
documentTerms.Add(termText);
termBytesRef = termsEnum.Next();
}
return documentTerms;
}
Теперь у меня есть документ, в котором значение поля "name" равно "dan gertler diamonds ltd."
Итак, термины из термина вектор, который я ожидаю, это:
Дэн Гертлер Даймондс Лтд
Но мой GetDocumentTerms
дает мне следующие термины:
Дан Бриллианты Gertlers Ltdtlers
Я использую как StandardAnalyzer
с полем, так что я не ожидаю, что оно будет сильно преобразовывать оригинальные слова в поле (и я проверил с этим конкретным именем и StandardAnalyzer).
Что я тут не так делаю и как это исправить?
Редактировать: Я извлекаю термины вручную с помощью каждого анализатора поля и помещаю их в отдельное строковое поле как временное решение.