小编Mik*_*hie的帖子

Solr:得分高于部分匹配的精确匹配

在一个非常简单的例子中,我有三个文件,文件名为"Lark","Larker"和"Larking"(没有文件扩展名).在solr中,我将这三个文件编入索引,将文件名映射到"标题"字段.当我搜索"Lark"时,返回所有三个文件(这是我想要的),但它们都被给予相同的分数.我希望"Lark"得分最高,因为它与我的查询完全匹配,其他人都落后了.

<field name="title" type="text_general" indexed="true" stored="true" multiValued="false"/>
Run Code Online (Sandbox Code Playgroud)

 

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>
Run Code Online (Sandbox Code Playgroud)

我相信他们获得相同分数的原因是因为EdgeNGramFilterFactory在指数时间就业.每个文档被索引为"La","Lar","Lark",其中两个文档("Larker"和"Larking")被索引了一些其他变体.因此,实际上每个文档都与查询"Lark"完全匹配.我想要一些执行查询的方法,其中术语"Lark"将返回所有三个文档,但标题为"Lark"的文档返回高于其他文档.

查询调试结果:

<lst name="debug">
  <str name="rawquerystring">Lark</str>
  <str name="querystring">Lark</str>
  <str name="parsedquery">text:lark</str>
  <str name="parsedquery_toString">text:lark</str>
  <lst name="explain">
    <str name="543d6ee4cbb33c26bbcf288b/xxnullxx/543d6ef9cbb33c26bbcf2892">
2.7104912 = (MATCH) weight(text:lark in 0) [DefaultSimilarity], result of:
  2.7104912 = fieldWeight in 0, product …
Run Code Online (Sandbox Code Playgroud)

java lucene solr solrj

6
推荐指数
1
解决办法
2669
查看次数

Solr/Solrj分页

我在我正在创建的Web应用程序中使用solr和solrj来获取索引和搜索功能.我的请求处理程序在solrconfig.xml中配置如下:

<requestHandler name="/select" class="solr.SearchHandler">
 <lst name="defaults">
   <str name="echoParams">explicit</str>
   <str name="start">0</str>
   <int name="rows">10</int>
   <str name="defType">edismax</str>
   <str name="qf">
      title^10.0 subtitle^7.0 abstract^5.0 content^1.0 text^1.0
   </str>
   <str name="pf">
      title^10.0 subtitle^7.0 abstract^5.0 content^1.0 text^1.0
   </str>
   <str name="df">text</str>

 </lst>
</requestHandler>
Run Code Online (Sandbox Code Playgroud)

目前,索引和搜索效果很好.但是,我想实现分页.配置文件包含"开始"和"行"数据.但是,在solrj中,当我运行时:

SolrQuery query = new SolrQuery(searchTerm);
System.out.println(query.getRequestHandler());
System.out.println(query.getRows());
System.out.println(query.getStart());
Run Code Online (Sandbox Code Playgroud)

三个打印语句均显示为null.我理解每个'gets'都有一个对应的'set',但我想象它们已经通过solrconfig.xml中的响应处理程序设置了.有人能告诉我吗?

java lucene solr solrj

4
推荐指数
2
解决办法
5420
查看次数

FileNotFoundException(拒绝权限)

所有,我正在使用commons-FileUpload来允许我的学生通过班级网站将他们的作业上传到我的服务器.它可以很好地在我的本地机器上运行tomcat/eclipse.但是,在我的服务器上测试时,我通过digitalocean.com获取了FileNotFoundException(PermissionDenied).

堆栈跟踪:

java.io.FileNotFoundException:
 /uploads/cosc111fall2013/Assignment1/Program1.java (Permission denied)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:209)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:160)
    at org.apache.commons.fileupload.disk.DiskFileItem.write(DiskFileItem.java:394)
    at uploadServlet.Uploader.doPost(Uploader.java:127)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
Run Code Online (Sandbox Code Playgroud)

违规代码:

try {
            for (FileItem fi : uploaded) {
                fi.write(new File(saveDirectory + fileName + "_"
                        + FilenameUtils.getName(fi.getName())));
            }
        } catch (Exception e) {
            e.printStackTrace();
            response.sendRedirect("/uploadFailed.jsp");
            return;
        }
Run Code Online (Sandbox Code Playgroud)

我只是简化了程序写入的目录,因此它们都是drw-rw-rw-.有小费吗?

java tomcat servlets apache-commons-fileupload

2
推荐指数
1
解决办法
1万
查看次数

暂停和恢复SwingWorker.doInBackground()

我有一个基本的Swing UI,只有一个标记为"Play"的按钮.按下按钮时,标签变为"暂停".按下按钮后,它会变为"恢复".

在"Play"上我实例化并执行SwingWorker.我想要的是能够暂停这个线程(不取消它)并根据上述按钮按下恢复它.但是,我不想在doInBackground()中使用Thread.sleep().这似乎有点hackish.有没有办法让运行doInBackground的线程阻塞?

java swing multithreading swingworker

2
推荐指数
1
解决办法
2121
查看次数

Lisp联合函数

我不介意承认这是一项令我难过的家庭作业.任何向正确方向的推动都是有用的.

我需要编写一个返回两个给定列表的并集的函数.我相信我的逻辑是合理的,但是Lisp语法正在推动我的发展.

到目前为止我的解决方案是这样

(defun inList (e L)
  (cond 
   ((null L) 
    nil) 
   ((equal (first L) e) 
    T) 
   (T 
    (inList e (rest L)))))

(defun union2 (L1 L2)
  (cond 
   ((null L2) 
    L1) 
   ((not (inList (first L2) L1)) 
    (append (union2 L1 (rest L2)) (first L2))) 
   (T 
    (union2 L1 (rest L2)))))
Run Code Online (Sandbox Code Playgroud)

当我使用空列表作为第二个参数测试函数,或者第二个参数是一个列表,其中每个项目都是第一个列表的成员时,它可以正常工作.

但是,当(union2 '(1 2 3) '(4 5 6))我接受测试时 6 is not of type list.

我很确定我的错误是: (append (union2 L1 (rest L2)) (first L2)

至于那时,(first L2)显然不是一个清单.然而,写它((first L2))是给我的Badly formed …

lisp common-lisp

0
推荐指数
1
解决办法
2927
查看次数