Совпадение с точным значением всего поля Lucene

Я создаю индекс Lucene 4.10.3.

Я использую StandardAnalyzer.

    String indexpath="C:\\TEMP";
    IndexWriterConfig iwc=newIndexWriterConfig(Version.LUCENE_4_10_3,new StandardAnalyzer(CharArraySet.EMPTY_SET)); 
    Directory dir = FSDirectory.open(new File(indexpath));          
    IndexWriter indexWriter = new IndexWriter(dir, iwc);
    iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);   
    Document doc = new Document();
    doc.add(new TextField("city", "ANDHRA",Store.YES));
    doc.add(new TextField("city", "ANDHRA PRADESH",Store.YES));
    doc.add(new TextField("city", "ASSAM AND NAGALAND",Store.YES));
    doc.add(new TextField("city", "ASSAM",Store.YES));
    doc.add(new TextField("city", "PUNJAB",Store.YES));
    doc.add(new TextField("city", "PUNJAB AND HARYANA",Store.YES));
    indexWriter.addDocument(doc);

когда я пытаюсь выполнить поиск в индексе lucene, используя фразовый запрос

Например

 try {
        QueryBuilder build=new QueryBuilder(new KeywordAnalyzer());
        Query q1=build.createPhraseQuery("city","ANDHRA");      
        Directory dir = FSDirectory.open(new File("C:\\TEMP"));
        DirectoryReader indexReader = DirectoryReader.open(dir);    
        IndexSearcher searcher = new IndexSearcher(indexReader);
        ScoreDoc hits[] = searcher.search(q1,10).scoreDocs;
        Set<String> set=new HashSet<String>();
        set.add("city");
        for (int i=0; i < hits.length; i++) {
            Document document = indexReader.document(hits[i].doc,set);
            System.out.println(document.get("city"));
        }
     } catch (IOException e) {
        e.printStackTrace();
     }

мы получаем результат следующим образом:

АНДХРА

АНДХРА-ПРАДЕШ

Когда я ищу «АНДХРА», как получить только результат «АНДХРА», а не «АНДХРА-ПРАДЕШ», как сопоставить все значение поля в lucene с помощью StandardAnalyzer?


person Rameshwar Nagpure    schedule 18.03.2016    source источник


Ответы (1)


Если вы хотите сопоставить точное, немодифицированное и немаркированное значение поля, вам вообще не следует его анализировать. Просто используйте StringField вместо TextField.

Если вам нужен некоторый анализ (т. е. нижний регистр или что-то в этом роде), но без токенизации, вы можете использовать KeywordTokenizer в вашей реализации Analyzer для этого.

Если вы используете QueryParser для создания запросов, имейте в виду, как синтаксический анализатор использует пробелы для разделения предложений запроса. Возможно, вам понадобится написать такие запросы: city:ANDHRA\ PRADESHне верю, что QueryParser.escape сделает это за вас).

person femtoRgon    schedule 18.03.2016