0

PerFieldAnalyzer を使用して、新しい LowercaseKeywordAnalyzer を使用するように ExactTitle を設定しています。

private Analyzer GetDefaultAnalyzer()
    {
        var perFieldAnalyzer = new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_30));
        perFieldAnalyzer.AddAnalyzer(ReportFields.ExactTitle, new LowercaseKeywordAnalyzer());
...

フィールドに追加して、インデックスを作成しています:

var exactTitleField = new Field(ReportFields.ExactTitle, report.PortalReportTitle, Field.Store.NO,
                                            Field.Index.NOT_ANALYZED);
            exactTitleField.Boost = 10.0f;
            reportDoc.Add(exactTitleField);

2 単語の例「test abc」を使用して検索すると、TermQuery 検索を実行しても見つかりません。

var term = new Term(exactField, "test abc");
var exactQuery = new TermQuery(term);
query.Add(exactQuery,Occur.SHOULD);
var hits = searcher.Search(query, null, HitsLimit, Sort.RELEVANCE);

「Test Abc」で検索すると、うまくいきます。この大文字と小文字を区別しないキーワード/用語検索を機能させるにはどうすればよいですか?

アナライザーは次のとおりです。

public class LowercaseKeywordAnalyzer : Analyzer
{

    public override TokenStream TokenStream(string fieldName, System.IO.TextReader reader)
    {
        TokenStream tokenStream = new KeywordTokenizer(reader);
        tokenStream = new LowerCaseFilter(tokenStream);
        return tokenStream;
    }
}

前もって感謝します。

4

1 に答える 1

2

フィールドを作成するときに指定するField.Index.NOT_ANALYZEDと、アナライザーは実行されず、テキストは小文字に変換されません。

それを切り替えるField.Index.ANALYZED

編集

インデックス作成コードに問題がある可能性があります。また、インデックス作成時に小文字を使用すると、検索時に入力を小文字にして一致を取得することも忘れないでください。

クエリは手動で作成するため、自分で処理する必要があります。理想的には、検索時Analyzerに作成する前に、文字列に対して同じことを実行する必要があります。Term

あなたがしようとしているように見えることを実行する簡単な小さなサンプルを掲載しました。何が間違っているのかを理解するのに役立つかもしれません。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Lucene.Net.Analysis;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Search;
using Lucene.Net.Store;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            RAMDirectory dir = new RAMDirectory();
            var perFieldAnalyzer = new PerFieldAnalyzerWrapper(new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30));
            perFieldAnalyzer.AddAnalyzer("ExactTitle", new LowercaseKeywordAnalyzer());

            IndexWriter indexWriter = new IndexWriter(dir, perFieldAnalyzer, IndexWriter.MaxFieldLength.UNLIMITED);

            Document reportDoc = new Document();
            Field exactTitleField = new Field("ExactTitle", 
                                                "Test Abc", 
                                                Field.Store.NO,
                                                Field.Index.ANALYZED);

            reportDoc.Add(exactTitleField);
            indexWriter.AddDocument(reportDoc);
            indexWriter.Commit();

            IndexSearcher searcher = new IndexSearcher(indexWriter.GetReader());

            var term = new Term("ExactTitle", "test abc"); //note: for this to work this way you need to always lower case the search too
            var exactQuery = new TermQuery(term);

            var hits = searcher.Search(exactQuery, null, 25, Sort.RELEVANCE);
            Console.WriteLine(hits.TotalHits); // prints "1"
            Console.ReadLine();

            indexWriter.Close();

        }

        public class LowercaseKeywordAnalyzer : Analyzer
        {

            public override TokenStream TokenStream(string fieldName, System.IO.TextReader reader)
            {
                TokenStream tokenStream = new KeywordTokenizer(reader);
                tokenStream = new LowerCaseFilter(tokenStream);
                return tokenStream;
            }
        }
    }
}
于 2013-03-18T19:09:43.627 に答える