我现在要实现这样的功能:
我在e:\\file 文件夹下有很多个xml文件,其内容形式是这样的:
<?xml version="1.0" encoding="UTF-8"?> 
<root>
<aka>bin laden</aka>
<firstName>bin</firstName>
<address>test</address>
<nationality>test</nationality>
<res>test</res>
</root>大家知道,用luncene开放搜索引擎,无非是建立索引和搜索这两部分。
因此,我首先要给这些xml文件建立索引。

现在有个要求:我在搜索的时候,我只搜索标签<aka>,<firstName>,<address>等这些标签中的内容,针对这个xml文件内容,其实,我只想搜索 bin ,bin laden,test这些内容,而不是标签本身。请问该怎么建立索引哦?
请给我代码哦,谢谢

解决方案 »

  1.   

    一个xml为一个document
    <aka>,<firstName>,<address>分别为一个field
    bin ,bin laden,test这些内容为一个field,比如叫desc;对内容进行切词分词
      

  2.   

    但事实上每个xml文件可能有很多个
    <?xml version="1.0" encoding="UTF-8"?> 
    <root>
    <aka>bin laden</aka>
    <firstName>bin</firstName>
    <address>test</address>
    <nationality>test</nationality>
    <res>test</res>
    </root>按照你的做法,其代码应该是:
    IndexWriter writer = new IndexWriter(INDEX_STORE_PATH,new MMAnalyzer(), true);
    Document doc = new Document();// 为文件名创建一个Field
    Field field = new Field("<aka>", "bin laden",Field.Store.YES,Field.Index.TOKENIZED);
    doc.add(field);// 把Document加入IndexWriter
    writer.addDocument(doc);
    但这样貌似和xml文件本身脱离了呀,它能找到e:\\file 下的这些文件内容吗?
    我不是很懂,请求明示,谢谢
      

  3.   

    要加一个ref的field的吗;ref=path;貌似路径的特殊符号会报错;需要对路径转换一下。取的时候再转 回来
      

  4.   

    这个ref 的field要stor的;否则拿不出来也白索引了
      

  5.   

    根据搜索;就知道有多少个xml文件有相关内容了。
    而且每个xml文件都可以用path来定位
      

  6.   

    楼上的,能告诉我你的qq吗?想请教你,我的qq:44758944
    其实这些xml文件是这样生成的,我在页面上导入一个文件,然后把内容解析成这些xml文件,然后再放到
    e:\\file 下面,这个时候,再给它建立索引

    楼上的,你能帮忙把我这代码改改吗?我没明白你说的
    “要加一个ref的field的吗;ref=path:”

    IndexWriter writer = new IndexWriter(INDEX_STORE_PATH,new MMAnalyzer(), true);
    Document doc = new Document();// 为文件名创建一个Field
    Field field = new Field("<aka>", "bin laden",Field.Store.YES,Field.Index.TOKENIZED);
    doc.add(field);// 把Document加入IndexWriter
    writer.addDocument(doc);
      

  7.   


    IndexWriter writer = new IndexWriter(INDEX_STORE_PATH,new MMAnalyzer(), true);
    Document doc = new Document();// 为文件名创建一个Field
    Field field = new Field("ref", "path变量",Field.Store.YES,Field.Index.UNTOKENIZED);
    //就是加上面一行;后面都一样。参考一下;我是这么搞的
    Field field = new Field("aka", "bin laden",Field.Store.YES,Field.Index.TOKENIZED);
    doc.add(field);// 把Document加入IndexWriter
    writer.addDocument(doc);
      

  8.   

    IndexWriter writer = new IndexWriter(INDEX_STORE_PATH,new MMAnalyzer(), true);
    Document doc = new Document();// 为文件名创建一个Field
    Field field = new Field("ref", "path变量",Field.Store.YES,Field.Index.UNTOKENIZED);
    //就是加上面一行;后面都一样。参考一下;我是这么搞的
    Field field = new Field("aka", "bin laden",Field.Store.YES,Field.Index.TOKENIZED);
    doc.add(field);// 把Document加入IndexWriter
    writer.addDocument(doc);你这段代码 有2个field变量哦,
    doc.add(field);// 把Document加入IndexWriter到底是加的那一个的呀?
      

  9.   

    变通一下吗;写疏忽了IndexWriter writer = new IndexWriter(INDEX_STORE_PATH,new MMAnalyzer(), true);
    Document doc = new Document();// 为文件名创建一个Field
    Field ref= new Field("ref", "path变量",Field.Store.YES,Field.Index.UNTOKENIZED);
    //就是加上面一行;后面都一样。参考一下;我是这么搞的
    Field field = new Field("aka", "bin laden",Field.Store.YES,Field.Index.TOKENIZED);
    doc.add(field);// 把Document加入IndexWriter
    doc.add(ref);// 
    writer.addDocument(doc);
      

  10.   

    建议field名不要加<>; 就aka,firstname, address这样方便。
      

  11.   

    7楼,9楼,你说的方法,有没有类似的代码啊,我对luncene不是很熟悉,不知道该怎么搜,你说的网上有资料,能给我一个网址吗?谢谢
      

  12.   

    下载一本lucene in action
      

  13.   

    IndexWriter writer = new IndexWriter(INDEX_STORE_PATH,new MMAnalyzer(), true);
    Document doc = new Document();// 为文件名创建一个Field
    Field ref= new Field("ref", "path变量",Field.Store.YES,Field.Index.UNTOKENIZED);
    //就是加上面一行;后面都一样。参考一下;我是这么搞的
    Field field = new Field("aka", "bin laden",Field.Store.YES,Field.Index.TOKENIZED);
    doc.add(field);// 把Document加入IndexWriter
    doc.add(ref);// 
    writer.addDocument(doc);
    你的代码我有些小小的疑问:
    比方说,有个xml文件是e:\\file\20100324.xml
    其内容就是若干个
    <?xml version="1.0" encoding="UTF-8"?> 
    <root>
    <aka>bin laden</aka>
    <firstName>bin</firstName>
    <address>test</address>
    <nationality>test</nationality>
    <res>test</res>
    </root>
    我在页面上输入bin laden 来搜索,我实际上是要搜索 e:\\file\20100324.xml
    这个文件中bin laden内容
    但你给我的代码是怎么自动找到这个文件的哦?我对这一块有些困惑,请求帮助
      

  14.   

    1、输入bin laden搜索
    2、取得搜索结果的引用集Hits
    3、
    Document doc = hits.doc(i);
    String ref = doc.get("ref");获得ref简单步骤就是这样,中间需要自己充实
      

  15.   

    有两种方案
    1. xml文件存在在FS中,lucene中索引;
       这时候,需要加一field用来保存,xml文件中fs中的实际存储位置;
       Field ref= new Field("filePath", "{your file path, c:\a.xml}",Field.Store.YES,Field.Index.UNTOKENIZED);
        Field field = new Field("content", "{只提取xml文件中的文本内容}",Field.Store.NO,Field.Index.TOKENIZED); 检索时,检索content内容即可,根据filePath从fs中加载实际xml文件;2. xml文件保存在lucene中;
        Field field = new Field("content", "{只提取xml文件中的文本内容}",Field.Store.NO,Field.Index.TOKENIZED);
        Field field = new Field("xml", "{xml文件内容}",Field.Store.YES,Field.Index.NO);
       检索时,检索content内容即可,从xml中直接读取xml内容;