Lucene.Net Cari nama file/jalur

Percobaan pertama saya dengan Lucene.Net

Saya memiliki Indeks dengan 500 Dokumen (html dan pdf) dengan beberapa bidang seperti url, konten, judul

Semua berfungsi dengan baik ketika saya mencari konten dan/atau judul
Namun ketika saya mencari Url saya tidak mendapatkan hasil

Jadi saya menemukan url seperti "/tlfdi/epapers/datenschutz2016/files/assets/common/downloads/page0004.pdf" tetapi bukan "page0004.pdf"
Juga dengan "*" tidak berfungsi.

Indeks dan Pencarian menggunakan WhitespaceAnalyzer. Dengan StandardAnalyzer saya tidak mendapatkan hasil apa pun saat mencari "/kontakt/index.aspx"

Mencari:

  WhitespaceAnalyzer analyzer = new WhitespaceAnalyzer();
  MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30,
    new[] { "url", "title", "description", "content", "keywords" }, analyzer);
  Query query = parseQuery(searchQuery, parser);
    Lucene.Net.Search.ScoreDoc[] hits = (Lucene.Net.Search.ScoreDoc[])searcher.Search(  
      query, null, hits_limit, Sort.RELEVANCE).ScoreDocs;

Seseorang dapat membantu?


person mMo    schedule 09.12.2016    source sumber
comment
Apakah Anda mengatakan istilah pencarian Anda adalah page0004.pdf dan Anda tidak mendapatkan hasil?   -  person RamblinRose    schedule 31.12.2016


Jawaban (1)


Tarif standar penganalisis tidak akan sesuai dengan keinginan Anda, sebaliknya, Anda harus menulis tokenizer dan penganalisis khusus.

Mudah! Kita hanya perlu membuat tokenizer dan analisa.

UrlTokenizer bertanggung jawab untuk menghasilkan token.

// UrlTokenizer delimits tokens by whitespace, '.' and '/'
using AttributeSource = Lucene.Net.Util.AttributeSource;  
public class UrlTokenizer : CharTokenizer
{
    public UrlTokenizer(System.IO.TextReader @in)
        : base(@in)
    {
    }
    public UrlTokenizer(AttributeSource source, System.IO.TextReader @in)
        : base(source, @in)
    {
    }

    public UrlTokenizer(AttributeFactory factory, System.IO.TextReader @in)
        : base(factory, @in)
    {
    }
    //
    // This is where all the magic happens for our UrlTokenizer!
    // Whitespace, forward slash or a period are a token boundary.
    // 
    protected override bool IsTokenChar(char c)
    {
        return !char.IsWhiteSpace(c) && c != '/' && c != '.';
    }
}

UrlAnalyzer menggunakan aliran input dan mengimplementasikan UrlTokenizer dan LowerCaseFilter untuk pencarian yang tidak peka huruf besar-kecil.

// Custom Analyzer implementing UrlTokenizer and LowerCaseFilter.
public sealed class UrlAnalyzer : Analyzer
{
    public override TokenStream TokenStream(System.String fieldName, System.IO.TextReader reader)
    {
        //
        // This is where all the magic happens for UrlAnalyzer!
        // UrlTokenizer token text are filtered to lowercase text.
        return new LowerCaseFilter(new UrlTokenizer(reader));
    }
    public override TokenStream ReusableTokenStream(System.String fieldName, System.IO.TextReader reader)
    {
        Tokenizer tokenizer = (Tokenizer)PreviousTokenStream;
        if (tokenizer == null)
        {
            tokenizer = new UrlTokenizer(reader);
            PreviousTokenStream = tokenizer;
        }
        else
            tokenizer.Reset(reader);
        return tokenizer;
    }
}

JADI, inilah kode yang mendemonstrasikan UrlAnalyzer. Saya mengganti MultiFieldQueryParser dengan QueryParser untuk kejelasan.

//
// Demonstrate UrlAnalyzer using an in memory index.
//
public static void testUrlAnalyzer()
{     
    string url = @"/tlfdi/epapers/datenschutz2016/files/assets/common/downloads/page0004.pdf";
    UrlAnalyzer analyzer = new UrlAnalyzer();
    Directory directory = new RAMDirectory();
    QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "url", analyzer);
    IndexWriter writer = new IndexWriter(directory, analyzer, true, new IndexWriter.MaxFieldLength(2048));
    //
    // index a document. We're only interested in the "url" field of a document.
    //
    Document doc = new Document();
    Field field = new Field("url", url, Field.Store.NO, Field.Index.ANALYZED);
    doc.Add(field);
    writer.AddDocument(doc);
    writer.Commit();
    //
    // search the index for any documents having 'page004.pdf' in the url field.
    //
    string searchText = "url:page0004.pdf";
    IndexReader reader = IndexReader.Open(directory, true);
    IndexSearcher searcher = new IndexSearcher(reader);
    Query query = parser.Parse(searchText);
    ScoreDoc[] hits = searcher.Search(query, null, 10, Sort.RELEVANCE).ScoreDocs;
    if (hits.Length == 0)
        throw new System.Exception("RamblinRose is fail!");
    //
    // search the index for any documents having the full URL we indexed.
    //
    searchText = "url:\"" + url + "\"";
    query = parser.Parse(searchText);
    hits = searcher.Search(query, null, 10, Sort.RELEVANCE).ScoreDocs;
    if (hits.Length == 0)
        throw new System.Exception("RamblinRose is fail!");
}

Lucene.net adalah barang bagus. Saya harap kode ini meningkatkan pemahaman Anda tentang analisis Lucene.

Semoga beruntung!

hal. hati-hati dengan penelusuran wildcard untuk memecahkan masalah, ini adalah pembunuh nyata pada indeks besar.

person RamblinRose    schedule 30.12.2016