Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

高亮搜索结果位置偏差 #222

Closed
kj863257 opened this issue Jun 1, 2016 · 5 comments
Closed

高亮搜索结果位置偏差 #222

kj863257 opened this issue Jun 1, 2016 · 5 comments
Labels

Comments

@kj863257
Copy link

kj863257 commented Jun 1, 2016

这个应该和 hankcs/hanlp-lucene-plugin@7a797a6 这个issues 有关系吧?

@kj863257
Copy link
Author

kj863257 commented Jun 1, 2016

文字内容为:

KingFileUpload ajax 上传文件插件 作者 烤鸡科技 主题选择: 点此下载 min版 (右键另存为) 示例 JS引用和CSS部分
<script src="/jquery.js"></script>
<script src="/demo/upload/jquery-kfileupload.js"></script>

&lt;!-- 对按钮一点简单的修饰 --&gt;
&lt;style&gt;
    #button{
        height:35px;
        width:120px;
        background-color: #407ced;
    }
    #button:hover{
        background-color: #49a4ed;
    }
    /* ↓按钮上的提示文字的样式修饰 */
    #button_msg{
        line-height:35px;
        display:inline-block;
        width:120px;
        text-align:center;
        color:white;
    }
&lt;/style&gt;

JS部分
$(function($){
//通过JS给指定的DIV绑定文件选择事件
$('#button').kingFileUpload({
'url':'/demo/upload.do',
'content':'<span id="button_msg">上传文件</span>',
'success':function(data){
data = $.parseJSON(data);
alert('状态码:'+data.rc + '\r\n消息:' + data.msg);
}
});
});
HTML

&lt;div id=&quot;button&quot;&gt;&lt;/div&gt;

效果演示(没有调用真实接口,但会请求服务器)

        文档 请求参数 
kingFileUpload 方法请求参数是一个 JSON 对象,可以省略部分参数,省略参数将以默认参数请求。
默认参数参见 $().kingFileUpload.default , 如下:

{
    &quot;url&quot;: &quot;http://127.0.0.1/&quot;,
    &quot;data&quot;: {},
    &quot;content&quot;: &quot;上传文件&quot;,
    &quot;name&quot;:&quot;file&quot;,
    &quot;autoUpload&quot;: true,
    &quot;submitButton&quot;: null
    &quot;success&quot;:function(data){},
    &quot;selectChange&quot;:function(filename){}
}

参数解释:

&quot;url&quot;: 上传文件请求地址

&quot;data&quot;: 一并传递的其它值

&quot;content&quot;: 选择文件按钮的提示文字,可以是 string 类型的纯文本也可以是标签,如 &#039;&lt;span id=&quot;button_msg&quot;&gt;上传文件&lt;/span&gt;&#039;

&quot;name&quot;: 文件提交到后台的属性名,默认为 &quot;file&quot;

&quot;autoUpload&quot;: 是否选择文件后自动上传,默认 true

&quot;submitButton&quot;: 提交按钮的对象;一个 jQuery 对象( 如$(&#039;#xxx&#039;) ),当 autoUpload 属性为 false 时有效

&quot;success&quot;:function(data){} 上传成功时的回调函数,data 是服务器响应(服务器响应头和浏览器行为直接有关),

&quot;selectChange&quot;:function(filename){} 选择一个文件时的回调函数,filename 是所选择的文件名(如果可以取到)

返回值
kingFileUpload 方法的返回值也是一个 JSON 对象,对象内包含所有应用的参数,还有另外两个函数可以调用,如:

var x = $(&#039;#button&#039;).kingFileUpload();

//http://127.0.0.1/
alert(x.url);

//string 类型,获取上次选择上传的文件名
x.getFileName();

//当 autoUpload 属性为 false 时,设置请求附加的参数,和 kingFileUpload 函数的 data 属性参数一致。
x.setData({});

@hankcs
Copy link
Owner

hankcs commented Jun 1, 2016

请仿照#74 ,提供友好的详细信息,谢谢。

@hankcs
Copy link
Owner

hankcs commented Jun 1, 2016

@kj863257
Copy link
Author

kj863257 commented Jun 1, 2016

测试代码如下:
`package cn.roastchicken.lucene.analyzer;

/**

  • @title: HighLighterTest.java

  • @Package cn.roastchicken.lucene.analyzer

  • @description: TODO(用一句话描述该文件做什么)

  • @author kangjie kangjie_litsoft_com_cn

  • @Date 2016年6月1日 上午10:05:16

  • @Version V1.0
    /
    /

  • He Han

  • me@hankcs.com

  • 2015/10/22 11:37
    *

  • Copyright (c) 2008-2015, 码农场. All Right Reserved, http://www.hankcs.com/

  • This source is subject to Hankcs. Please contact Hankcs to get more information.

  • */

import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.highlight.Fragmenter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.store.RAMDirectory;

import junit.framework.TestCase;

/**

  • 演示高亮搜索结果

  • @author hankcs
    *
    */
    public class HighLighterTest extends TestCase {

    public void testHightlight() throws Exception {
    // Lucene Document的主要域名
    String fieldName = "text";

    // 实例化Analyzer分词器
    Analyzer analyzer = new HanLPAnalyzer();
    
    Directory directory = null;
    IndexWriter iwriter;
    IndexReader ireader = null;
    IndexSearcher isearcher;
    try {
        // 索引过程**********************************
        // 建立内存索引对象
        directory = new RAMDirectory();
    
        // 配置IndexWriterConfig
        IndexWriterConfig iwConfig = new IndexWriterConfig(analyzer);
        iwConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
        iwriter = new IndexWriter(directory, iwConfig);
        {
            // 加入一个文档
            Document doc = new Document();
            doc.add(new TextField(fieldName, "KingFileUpload ajax 上传文件插件 作者 烤鸡科技 主题选择: 点此下载 min版 (右键另存为) 示例 JS引用和CSS部分 \r\n    <script src=\"/jquery.js\"></script>\r\n    <script src=\"/demo/upload/jquery-kfileupload.js\"></script>\r\n\r\n    <!-- 对按钮一点简单的修饰 -->\r\n    <style>\r\n        #button{\r\n            height:35px;\r\n            width:120px;\r\n            background-color: #407ced;\r\n        }\r\n        #button:hover{\r\n            background-color: #49a4ed;\r\n        }\r\n        /* ↓按钮上的提示文字的样式修饰 */\r\n        #button_msg{\r\n            line-height:35px;\r\n            display:inline-block;\r\n            width:120px;\r\n            text-align:center;\r\n            color:white;\r\n        }\r\n    </style>\r\n JS部分 \r\n    $(function($){\r\n        //通过JS给指定的DIV绑定文件选择事件\r\n        $('#button').kingFileUpload({\r\n            'url':'/demo/upload.do',\r\n            'content':'<span id=\"button_msg\">上传文件</span>',\r\n            'success':function(data){\r\n                data = $.parseJSON(data);\r\n                alert('状态码:'+data.rc + '\r\n消息:' + data.msg);\r\n            }\r\n        });\r\n    });\r\n HTML \r\n    \r\n    <div id=\"button\"></div>\r\n    \r\n 效果演示(没有调用真实接口,但会请求服务器) \r\n                \r\n            文档 请求参数 \r\n    kingFileUpload 方法请求参数是一个 JSON 对象,可以省略部分参数,省略参数将以默认参数请求。\r\n    默认参数参见 $().kingFileUpload.default , 如下:\r\n\r\n    {\r\n        \"url\": \"http://127.0.0.1/\",\r\n        \"data\": {},\r\n        \"content\": \"上传文件\",\r\n        \"name\":\"file\",\r\n        \"autoUpload\": true,\r\n        \"submitButton\": null\r\n        \"success\":function(data){},\r\n        \"selectChange\":function(filename){}\r\n    }\r\n\r\n    参数解释:\r\n\r\n    \"url\": 上传文件请求地址\r\n\r\n    \"data\": 一并传递的其它值\r\n\r\n    \"content\": 选择文件按钮的提示文字,可以是 string 类型的纯文本也可以是标签,如 '<span id=\"button_msg\">上传文件</span>'\r\n\r\n    \"name\": 文件提交到后台的属性名,默认为 \"file\"\r\n\r\n    \"autoUpload\": 是否选择文件后自动上传,默认 true\r\n\r\n    \"submitButton\": 提交按钮的对象;一个 jQuery 对象( 如$('#xxx') ),当 autoUpload 属性为 false 时有效\r\n\r\n    \"success\":function(data){} 上传成功时的回调函数,data 是服务器响应(服务器响应头和浏览器行为直接有关),\r\n\r\n    \"selectChange\":function(filename){} 选择一个文件时的回调函数,filename 是所选择的文件名(如果可以取到)\r\n\r\n\r\n 返回值 \r\n    kingFileUpload 方法的返回值也是一个 JSON 对象,对象内包含所有应用的参数,还有另外两个函数可以调用,如:\r\n\r\n\r\n    var x = $('#button').kingFileUpload();\r\n\r\n    //http://127.0.0.1/\r\n    alert(x.url);\r\n\r\n    //string 类型,获取上次选择上传的文件名\r\n    x.getFileName();\r\n\r\n    //当 autoUpload 属性为 false 时,设置请求附加的参数,和 kingFileUpload 函数的 data 属性参数一致。\r\n    x.setData({});", Field.Store.YES));
            doc.add(new TextField("title", "关于hankcs", Field.Store.YES));
            iwriter.addDocument(doc);
        }
        iwriter.close();
    
        // 搜索过程**********************************
        // 实例化搜索器
        ireader = DirectoryReader.open(directory);
        isearcher = new IndexSearcher(ireader);
    
        String keyword = "返回";
        // 使用QueryParser查询分析器构造Query对象
        QueryParser qp = new QueryParser(fieldName, analyzer);
        Query query = qp.parse(keyword);
        System.out.println("Query = " + query);
    
        // 搜索相似度最高的5条记录
        TopDocs topDocs = isearcher.search(query, 5);
        System.out.println("命中:" + topDocs.totalHits);
        // 输出结果
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
    
        for (int i = 0; i < Math.min(5, scoreDocs.length); ++i) {
            Document targetDoc = isearcher.doc(scoreDocs[i].doc);
            System.out.print(targetDoc.getField("title").stringValue());
            System.out.println(" , " + scoreDocs[i].score);
    
            String text = targetDoc.get(fieldName);
            System.out.println(displayHtmlHighlight(query, analyzer, fieldName, text, 200));
        }
    } catch (CorruptIndexException e) {
        e.printStackTrace();
    } catch (LockObtainFailedException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ParseException e) {
        e.printStackTrace();
    } catch (InvalidTokenOffsetsException e) {
        e.printStackTrace();
    } finally {
        if (ireader != null) {
            try {
                ireader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (directory != null) {
            try {
                directory.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    }

    /**

    • 获取高亮显示结果的html代码
    • @param query
    •        查询
      
    • @param analyzer
    •        分词器
      
    • @param fieldName
    •        域名
      
    • @param fieldContent
    •        域内容
      
    • @param fragmentSize
    •        结果的长度(不含html标签长度)
      
    • @return 结果(一段html代码)
    • @throws IOException
    • @throws InvalidTokenOffsetsException
      */
      static String displayHtmlHighlight(Query query, Analyzer analyzer, String fieldName, String fieldContent, int fragmentSize) throws IOException, InvalidTokenOffsetsException {
      // 创建一个高亮器
      Highlighter highlighter = new Highlighter(new SimpleHTMLFormatter("", ""), new QueryScorer(query));
      Fragmenter fragmenter = new SimpleFragmenter(fragmentSize);
      highlighter.setTextFragmenter(fragmenter);
      return highlighter.getBestFragment(analyzer, fieldName, fieldContent);
      }
      }
      `

hankcs added a commit to hankcs/hanlp-lucene-plugin that referenced this issue Jun 1, 2016
@hankcs
Copy link
Owner

hankcs commented Jun 1, 2016

问题已修复,感谢反馈。

@hankcs hankcs closed this as completed Jun 1, 2016
@hankcs hankcs added the bug label Jun 1, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants