在Solr中索引和查询URLS

7
我有一个URL数据库需要搜索。由于URL的书写方式不总是相同(可能有www,也可能没有),我正在寻找正确的索引和查询URL的方法。 我尝试了几个方法,但仍不确定为什么它不起作用:
以下是我的自定义字段类型:
 <fieldType name="customUrlType" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0" preserveOriginal="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0" preserveOriginal="0"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

例如:
当索引时,http://www.twitter.com/AndersonCooper将在不同的位置具有以下单词:http、www、twitter、com和andersoncooper。
如果我只搜索twitter.com/andersoncooper,我希望此查询与已索引的记录匹配,这就是为什么我还使用WDF拆分搜索查询的原因,但搜索查询最终变成了这样:
myfield:("twitter com andersoncooper"),而我真正想要的是匹配所有具有以下单独单词的记录:twitter、com和andersoncooper。
是否应该使用不同的查询过滤器或分词器?

1
你最终解决了这个问题吗? - Cyrus
1
你弄清楚这里需要做什么了吗? - Cool Techie
3个回答

2
如果我理解您问题中的陈述,您正在尝试编写一个查询以匹配以下两个条件:

您的查询是 myfield:("twitter com andersoncooper"),而实际上您希望匹配所有包含以下三个单独单词的记录:twitter、com和andersoncooper。
http://www.twitter.com/AndersonCooper

并且

http://www.andersoncooper.com/socialmedia/twitter

这两个链接包含所有的令牌,但不匹配任何一个。

http://www.facebook.com/AndersonCooper 

或者
http://www.twitter.com/AliceCooper

如果这是正确的,你现有的配置应该可以正常工作。假设你正在使用标准查询解析器并且通过curl或其他基于url的机制进行查询,你需要让查询参数看起来像这样:
&q=myField:andersoncooper AND myField:twitter AND myField:com

你可能会遇到的一个坑是默认的查询运算符(在查询中连接术语的运算符)是“OR”,这就是为什么上面必须明确指定“AND”的原因。如果想要节省一些空间,也可以像下面这样将默认的查询运算符更改为“AND”:

&q.op=AND&q=myField:(andersoncooper twitter com)

0
这应该是最简单的解决方案:
<field name="iconUrl" type="string" indexed="true" stored="true" />

但是根据您的要求,您需要将其设置为多值并将其索引为1。 1.没有更改2.没有http 3.没有www

或者通过通配符在前面使URL可搜索(这可能会更慢)


是的,如果 string 来自于 StrField,它将不会被分析,但可以被存储/索引,我想这对于URL来说是合适的。 - Eric
这对于 OP 指定 URL 的部分的查询不起作用。 - Gus

-1

你可以尝试使用关键词分词器

来自Packt出版的Solr 1.4企业搜索服务器一书

KeywordTokenizerFactory:实际上它并不执行任何分词操作,事实上什么都不做!它将原始文本作为一个术语返回。有些情况下,您需要处理一个只包含一个单词的字段,但是您需要进行一些基本的分析,例如小写处理。然而,由于排序或聚合要求,您可能需要一个最多只有一个术语的索引字段。如果提供了文档标识符字段且不是数字,则肯定会使用此字段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接