Я работаю с Lucene.NET, и это здорово. затем работал над тем, как заставить его искать азиатские языки. поэтому я перешел со StandardAnalyzer на CJKAnalyzer.
это отлично работает для корейского языка (хотя StandardAnalyzer работал нормально для корейского языка!), И китайского языка (который не работал), но я все еще не могу заставить программу распознавать японский текст.
просто в качестве очень маленького примера я пишу крошечную базу данных (используя CJKAnalyzer) с несколькими словами в ней, а затем пытаюсь прочитать из базы данных:
public void Write(string text, AnalyzerType type)
{
Document document = new Document();
document.Add(new Field(
"text",
text,
Field.Store.YES,
Field.Index.ANALYZED));
IndexWriter correct = this.chineseWriter;
correct.AddDocument(document);
}
это для письма. и для чтения:
public Document[] ReadMultipleFields(string text, int maxResults, AnalyzerType type)
{
Analyzer analyzer = this.chineseAnalyzer;
QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "text", analyzer);
var query = parser.Parse(text);
// Get the fields.
TopFieldCollector collector = TopFieldCollector.create(
new Sort(),
maxResults,
false,
true,
true,
false);
// Then use the searcher.
this.searcher.Search(
query,
null,
collector);
// Holds the results
List<Document> documents = new List<Document>();
// Get the top documents.
foreach (var scoreDoc in collector.TopDocs().scoreDocs)
{
var doc = this.searcher.Doc(scoreDoc.doc);
documents.Add(doc);
}
// Send the list of docs back.
return documents.ToArray();
}
при этом chineseWriter — это просто IndexWriter с переданным CJKAnalyzer, а chineseAnalyzer — это просто CJKAnalyzer.
какой-нибудь совет, почему японский не работает? ввод, который я отправляю, кажется справедливым:
プーケット
это то, что я буду хранить, но не могу прочитать. :(
РЕДАКТИРОВАТЬ: я был неправ... Китайский тоже не работает: если поисковый запрос длиннее 2 символов, он перестает работать. То же, что японский.
РЕДАКТИРОВАТЬ ЧАСТЬ 2: Теперь я вижу, что проблема заключается в использовании поиска по префиксу. Если я ищу первые 2 символа и использую звездочку, тогда это работает. Как только я перехожу 2, то он перестает работать. Я думаю, это из-за того, как слово токенизировано? Если я ищу полный термин, то он его находит. Можно ли использовать префиксный поиск в Lucene.NET для CJK? プ* будет работать, но プーケ* ничего не найдет.
プーケット
это Пхукет, город в Таиланде. :) А на другое ответить не могу. - person t_motooka   schedule 12.01.2012