Lucene stringfield没有结果

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$ 私有静态最终字符

我有一个针对Lucene 5.3.1的junit测试,这让我很困惑。我正在尝试测试字段“代码”的搜索。索引中的每个文档都设置了此字段,所以搜索应返回索引中的所有文档。但我没有得到任何结果。当我将“代码”字段更改为文本字段时,一切都正常。 以下是测试:


公共类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;
  }
}