Solr:从单词词典中自动链接到正文

时间:2013-07-18 14:56:02

标签: dictionary solr

我正在寻找在solr中生成body结果中的自动链接。链接上的字词必须在字典中。

例如:

doc:

<doc>

    [...]

    <str name="title">Il faut, quand on gouverne, voir les hommes tels qu’ils sont, et les choses telles qu’elles devraient être.</str>
    <str name="path">citation/faut-gouverne-voir-hommes-tels-choses-telles-devraient-etre-15.php</str>
    <str name="ss_field_citation_keywords">#faut#gouverne#voir#hommes#tels#choses#telles#devraient#etre#</str>

    [...]
</doc>

从标题到显示的正文:

Il faut, quand on gouverne, voir les hommes tels qu’ils sont, et les choses telles qu’elles devraient être.

来自ss_field_citation_keywords的链接:

#faut#gouverne#voir#hommes#tels#choses#telles#devraient#etre#

正文必须显示如下:

Il <a href="foo/faut">faut</a>, quand on <a href="foo/gouverne">gouverne</a>, <a href="foo/voir">voir</a> les <a href="foo/hommes">hommes</a> <a href="foo/tels">tels</a> qu’ils sont, et les <a href="foo/choses">choses</a> <a href="foo/telles">telles</a> qu’elles <a href="foo/devraient">devraient</a> <a href="foo/etre">être</a>.

Il faut,qu gouvernevoir les hommes tels qu'ils sont,et les choses {{3} } qu'elles telles devraient

你有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这里有两个阶段:

  1. 确定关键字。为此,您需要正确构建分析仪链。空白标记器,小写过滤器 - 这是关键部分 - KeepWordFilterFactory。这将使Solr仅在文本中保留偏移量。
  2. 获得那些补偿。可能有几种方法,但其中一种方法是重用Field Analyzer,您可以在最新(4+)Solr的管理WebUI中进行实验。请务必检查详细框。这使用/analysis/field终点,您也可以使用它(使用详细标记)。结果对你来说可能过于冗长,但足以开始。然后,您可以寻找更好的实现或复制/减少当前完成的实现。

答案 1 :(得分:0)

使用velocity和java类进行内部处理的提议

public class autoLinkCitationDirective extends Directive{

public String getName() {
    return "autolinkcitation";
}

public int getType() {
    return LINE;
}

public boolean render(InternalContextAdapter context, Writer writer, Node node)
        throws IOException, ResourceNotFoundException, ParseErrorException, MethodInvocationException {

    String CitationMe   = null;
    String KeyWords     = null;
    String SchemaUrl    = null;

    //params
    if (node.jjtGetChild(0) != null) {
        CitationMe = String.valueOf(node.jjtGetChild(0).value(context));
    }
    if (node.jjtGetChild(1) != null) {
        KeyWords = String.valueOf(node.jjtGetChild(1).value(context));
    }

    //schema url
    if (node.jjtGetChild(2) != null) {
        SchemaUrl = String.valueOf(node.jjtGetChild(2).value(context));
    }

    writer.write(autoLinkCitation(CitationMe, KeyWords, SchemaUrl));

    return true;
}

public String autoLinkCitation(String CitationMe, String KeyWords, String SchemaUrl) {
    if (CitationMe == null) {
        return null;
    }

    List<String> tokens = new ArrayList<String>();
    StringTokenizer stkKeyWords = new StringTokenizer(KeyWords, "#");
    while ( stkKeyWords.hasMoreTokens() ) {
        tokens.add(stkKeyWords.nextToken());
    }


    String patternString = "\\b(" + StringUtils.join(tokens, "|") + ")\\b";
    Pattern pattern = Pattern.compile(patternString);

    String strippedHtml = CitationMe.replaceAll("<(.|\n)*?>", "");
    StringTokenizer st = new StringTokenizer(strippedHtml, ".,! ()[]");

    while (st.hasMoreTokens())
    {
        String token = st.nextToken().trim();
        if (token.length() > 3)
        {
            Matcher matcher = pattern.matcher(cleanString(token));
            while (matcher.find()) {
                if(CitationMe.indexOf( SchemaUrl + cleanString(token) + "'") == -1)
                {
                    String tmpStringreplacement = "<a href='" + SchemaUrl + cleanString(token) + "'>"+token+"</a>";
                    CitationMe = CitationMe.replaceAll("\\b"+token+"\\b(?!/)",tmpStringreplacement);
                }
            }
        }
    }

    return CitationMe;
}

public String cleanString(String CleanStringMe) {
    if (CleanStringMe == null) {
        return null;
    }

    CleanStringMe =  Normalizer.normalize(CleanStringMe, Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
    CleanStringMe = CleanStringMe.toLowerCase();
    CleanStringMe = CleanStringMe.replaceAll("[^A-Za-z0-9]", "-");
    return CleanStringMe;
}
}

并显示:

#autolinkcitation($doc.getFieldValue('body'),$doc.getFieldValue('ss_field_citation_keywords'), '/citations/mot.php?mot=' )