0

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

例如 :

一个文档:

<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 , quand on gouverne , voir les hommes tels qu'ils sont, et les chooses telles qu'elles devraient être

你有什么主意吗?

4

2 回答 2

1

这里有两个阶段:

  1. 识别关键词。为此,您需要正确构建分析器链。空白标记器、小写过滤器和 - 这是关键部分 - KeepWordFilterFactory。这将使 Solr 仅在文本中保留带有偏移量的关键字。
  2. 获取那些偏移量。可能有多种方法,但其中之一是重用 Field Analyzer,您可以在最新 (4+) Solr 的管理 WebUI 中进行试验。确保选中详细框。它使用/analysis/field端点,您也可以使用它(带有详细标志)。结果可能对您来说过于冗长,但足以开始。然后您可以寻找更好的实现或复制/减少当前完成的实现。
于 2013-07-19T01:08:27.453 回答
0

使用速度和 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=' )
于 2013-07-19T11:29:29.157 回答