Bagaimana cara mengindeks kode negara kueri dengan lucene?

Saya membuat indeks lucene untuk nama kota dan kode negara (bergantung satu sama lain). Saya ingin kode negara dapat dicari dengan huruf kecil dan sama persis.

Pada awalnya, saya sekarang mencoba menanyakan satu kode negara dan menemukan semua elemen yang diindeks yang cocok dengan kode tersebut. Menurut saya hasilnya selalu kosong.

//prepare
VERSION = Version.LUCENE_4_9;
IndexWriterConfig config = new IndexWriterConfig(VERSION, new SimpleAnalyzer());

//index
Document doc = new Document();
doc.add(new StringField("countryCode", countryCode, Field.Store.YES));
writer.addDocument(doc);

//lookup
Query query = new QueryParser(VERSION, "countryCode", new SimpleAnalyzer()).parse(countryCode);

Hasil: ketika saya menanyakan kode negara seperti "IT", "DE", "EN" dll, hasilnya selalu kosong. Mengapa? Apakah SimpleAnalyzer dari untuk kode negara 2 huruf?


person membersound    schedule 01.08.2014    source sumber


Jawaban (2)


Saya agak bingung di sini. Saya akan berasumsi penulis indeks Anda diinisialisasi di beberapa bagian kode Anda yang tidak disediakan, tetapi bukankah Anda meneruskan Version ke SimpleAnalyzer? Tidak ada konstruktor arg untuk SimpleAnalyzer, tidak sejak 3.X.

Itulah satu-satunya masalah nyata yang saya lihat. Berikut adalah contoh kerja menggunakan kode Anda:

private static Version VERSION;

public static void main(String[] args) throws IOException, ParseException {
    //prepare
    VERSION = Version.LUCENE_4_9;
    Directory dir = new RAMDirectory();
    IndexWriterConfig config = new IndexWriterConfig(VERSION, new SimpleAnalyzer(VERSION));
    IndexWriter writer = new IndexWriter(dir, config);

    String countryCode = "DE";

    //index
    Document doc = new Document();
    doc.add(new TextField("countryCode", countryCode, Field.Store.YES));
    writer.addDocument(doc);
    writer.close();

    IndexSearcher search = new IndexSearcher(DirectoryReader.open(dir));
    //lookup
    Query query = new QueryParser(VERSION, "countryCode", new SimpleAnalyzer(VERSION)).parse(countryCode);

    TopDocs docs = search.search(query, 1);
    System.out.println(docs.totalHits);
}
person femtoRgon    schedule 02.08.2014
comment
Saya menemukan masalah: Saya menggunakan StringField alih-alih TextField, karena dokumen mengatakan: Bidang yang diindeks tetapi tidak diberi token: seluruh nilai String diindeks sebagai satu token. Misalnya ini mungkin digunakan untuk kolom 'negara' atau 'id'. Tahukah Anda mengapa ini tidak berhasil? Ini berfungsi saat menggunakan TextField seperti yang Anda sarankan.+ - person membersound; 04.08.2014
comment
Ya, hasil edit itu menjelaskannya. StringField tidak dianalisis, representasi yang diindeks masih berupa huruf besar. Kueri Anda masih dianalisis, sehingga akan diturunkan huruf kecilnya oleh SimpleAnalyzer. - person femtoRgon; 04.08.2014

Untuk StringField, Anda dapat menggunakan TermQuery daripada QueryParser

Directory dir = new RAMDirectory();
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_9, new SimpleAnalyzer(Version.LUCENE_4_9));
IndexWriter writer = new IndexWriter(dir, config);

String countryCode = "DE";

// index
Document doc = new Document();
doc.add(new StringField("countryCode", countryCode, Store.YES));
writer.addDocument(doc);
writer.close();

IndexSearcher search = new IndexSearcher(DirectoryReader.open(dir));
//lookup
Query query = new TermQuery(new Term("countryCode", countryCode));

TopDocs docs = search.search(query, 1);
System.out.println(docs.totalHits);
person serem    schedule 07.08.2014