работя с 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