2016-01-29 2 views
1

Или я неправильно понимаю использование этого класса. Проверьте код ниже ... (Это в Scala, но это должно быть легко понять идею)`FieldValueQuery` является багги

import org.apache.lucene.store._ 
import org.apache.lucene.document._ 
import org.apache.lucene.index._ 
import org.apache.lucene.analysis.core._ 
import org.apache.lucene.search._ 

val directory = new RAMDirectory() 
val config = new IndexWriterConfig(new WhitespaceAnalyzer()) 
val writer = new IndexWriter(directory, config) 
writer.addDocument({ 
    val document = new Document() 
    document.add(new StringField("foo", "bar", Field.Store.YES)) 
    document 
}) 
writer.commit() 

val searcher = new IndexSearcher(DirectoryReader.open(directory)) 

{ 
    val query = new ConstantScoreQuery(new FieldValueQuery("foo")) 
    Console.println(searcher.search(query, 1).totalHits) 
} 

{ 
    val query = new TermQuery(new Term("foo", "bar")) 
    Console.println(searcher.search(query, 1).totalHits) 
} 

выход,

[info] 0 
[info] 1 

Является ли это ошибка или я пропускаю что-нибудь ? (Я использую Lucene 5.4.1)

ответ

1

FieldValueQuery проверяет, есть ли для этого поля DocValue, а не индексированное/сохраненное содержимое поля tranditional. Если добавить DocValuesField к документу, вы должны увидеть это получить результат для запроса, например:

val document = new Document() 
document.add(new StringField("foo", "bar", Field.Store.YES)) 
document.add(new SortedDocValuesField("foo", new BytesRef("bar")) 
document 

Выезд the DocValues API и this blog post introducing them для некоторой информации о том, что DocValues ​​все о.

+0

Спасибо! Что делать, если я просто хочу искать документы, имеющие конкретное поле? До 5 я использовал 'FieldValueFilter', и он работал как шарм. Теперь в 5 это устарело, мне интересно, что следует использовать вместо этого? – Sheng

Смежные вопросы