Lucene stringfield没有结果
我有一个针对Lucene 5.3.1的junit测试,这让我很困惑。我正在尝试测试字段“代码”的搜索。索引中的每个文档都设置了此字段,所以搜索应返回索引中的所有文档。但我没有得到任何结果。当我将“代码”字段更改为文本字段时,一切都正常。 以下是测试:Lucene stringfield没有结果,lucene,Lucene,我有一个针对Lucene 5.3.1的junit测试,这让我很困惑。我正在尝试测试字段“代码”的搜索。索引中的每个文档都设置了此字段,所以搜索应返回索引中的所有文档。但我没有得到任何结果。当我将“代码”字段更改为文本字段时,一切都正常。 以下是测试: 公共类LuceNet{ 私有静态最终字符串代码\u字段\u NAME=“CODE”; 私有静态最终字符串ID\u字段\u NAME=“ID”; 私有静态最终字符串代码\u VALUE=“Address”//$NON-NLS-1$ 私有静态最终字符
公共类LuceNet{
私有静态最终字符串代码\u字段\u NAME=“CODE”;
私有静态最终字符串ID\u字段\u NAME=“ID”;
私有静态最终字符串代码\u VALUE=“Address”//$NON-NLS-1$
私有静态最终字符串标记\u FIELD\u NAME=“TAGS”;//$NON-NLS-1$
@试验
公共void testCode(){
目录目录=新的RAMDirectory();
Analyzer Analyzer=新的StandardAnalyzer();
试一试{
创建文档(分析器、目录);
IndexReader=DirectoryReader.open(目录);
IndexSearcher search=新的IndexSearcher(阅读器);
列表结果=空;
//代码
结果=搜索(“代码:”+代码值,搜索者,
分析仪);
Assert.assertEquals(6,result.size());
}捕获(例外e){
e、 printStackTrace();
Assert.fail(如getMessage());
}
}
私有静态列表搜索(字符串查询字符串,
IndexSearcher搜索程序、Analyzer分析器)引发异常,
IOException{
Query q=新的QueryParser(标记\字段\名称,分析器)。parse(queryString);
TopDocs=searcher.search(q,10);
List res=new ArrayList();
for(scoredocd:docs.scoreDocs){
文档文档=searcher.doc(d.doc);
res.add(doc);
}
返回res;
}
/**
*@param分析器
*@param目录
*@throws corruptindexception
*@lockActainFailedException
*@抛出异常
*/
私有静态void createDocuments(Analyzer Analyzer,目录)
引发CorruptIndexException、LockActainFailedException、IOException{
IndexWriterConfig conf=新的IndexWriterConfig(分析器);
IndexWriter-iwriter=newindexwriter(目录,conf);
createDocument(1L,“Unter den Linden”,“1”,“Berlin”,iwriter);
createDocument(2L,“百老汇”,“32,2/20”,“纽约”,iwriter);
createDocument(3L,“主要道路”,“16”,“新罕布什尔州”,iwriter);
createDocument(5L,“Moselgasse”,“15”,“Wien”,iwriter);
iwriter.close();
}
私有静态文档createDocument(长id、字符串houseNum、,
字符串街、字符串城市、索引编写器(iwriter)
引发CorruptIndexException,IOException{
单据单据=新单据();
添加文档(新的文本字段(标记\字段\名称、houseNum、Store.NO));
添加文档(新文本字段(标签、字段、名称、街道、商店编号));
添加文档(新文本字段(标签\字段\名称、城市、商店编号));
添加文件(新长字段(ID_字段_名称,ID,Store.YES));
文件添加(新字符串字段(代码字段名称、,
代码_值,存储区编号);
iwriter.addDocument(文档);
退货单;
}
}
请看一看。这个问题的答案可能也是你问题的答案。简而言之:StrFields
不能应用任何标记化或分析/过滤器,而TextFields
可以。我认为这不是问题所在。我希望在“代码”字段上有精确的马赫数,我使用StringField,但在我的测试中仍然没有得到结果。参见:doc.add(新字符串字段(代码字段名称、代码值、存储号))
之后的查询是“code:+code\u值
搜索时,code\u值
是否会小写,因此匹配失败?如果您将值更改为address
,该怎么办?如果您是对的,我必须习惯逻辑。StringField精确存储值,但在搜索StandardAnalyzer时,将搜索词小写,因此未找到结果?在堆栈溢出时,请向上投票您认为有用且信息丰富的问题和答案。我不明白:如果由于analyzer搜索“abCD0123”而找不到类似“abCD0123”的字符串字段,不能搜索字符串字段,除非它们是小写的?或者有没有其他方法可以按原样存储值并准确地找到它们?
public class LuceneTest {
private static final String CODE_FIELD_NAME = "code";
private static final String ID_FIELD_NAME = "id";
private static final String CODE_VALUE = "Address"; //$NON-NLS-1$
private static final String TAGS_FIELD_NAME = "tags"; //$NON-NLS-1$
@Test
public void testCode() {
Directory directory = new RAMDirectory();
Analyzer analyzer = new StandardAnalyzer();
try {
createDocuments(analyzer, directory);
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
List<Document> result = null;
// code
result = search("code:" + CODE_VALUE, searcher,
analyzer);
Assert.assertEquals(6, result.size());
} catch (Exception e) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
}
private static List<Document> search(String queryString,
IndexSearcher searcher, Analyzer analyzer) throws ParseException,
IOException {
Query q = new QueryParser(TAGS_FIELD_NAME, analyzer).parse(queryString);
TopDocs docs = searcher.search(q, 10);
List<Document> res = new ArrayList<Document>();
for (ScoreDoc d : docs.scoreDocs) {
Document doc = searcher.doc(d.doc);
res.add(doc);
}
return res;
}
/**
* @param analyzer
* @param directory
* @throws CorruptIndexException
* @throws LockObtainFailedException
* @throws IOException
*/
private static void createDocuments(Analyzer analyzer, Directory directory)
throws CorruptIndexException, LockObtainFailedException, IOException {
IndexWriterConfig conf = new IndexWriterConfig(analyzer);
IndexWriter iwriter = new IndexWriter(directory, conf);
createDocument(1L, "Unter den Linden", "1", "Berlin", iwriter);
createDocument(2L, "Broadway", "32, 2/20", "New York", iwriter);
createDocument(3L, "Main road", "16", "New Hampshire", iwriter);
createDocument(5L, "Moselgasse", "15", "Wien", iwriter);
iwriter.close();
}
private static Document createDocument(Long id, String houseNum,
String street, String city, IndexWriter iwriter)
throws CorruptIndexException, IOException {
Document doc = new Document();
doc.add(new TextField(TAGS_FIELD_NAME, houseNum, Store.NO));
doc.add(new TextField(TAGS_FIELD_NAME, street, Store.NO));
doc.add(new TextField(TAGS_FIELD_NAME, city, Store.NO));
doc.add(new LongField(ID_FIELD_NAME, id, Store.YES));
doc.add(new StringField(CODE_FIELD_NAME,
CODE_VALUE, Store.NO));
iwriter.addDocument(doc);
return doc;
}
}