我在MySQL表中有两个表字段。 一个是VARCHAR,是分类(分类广告网站)的“标题”。 另一个是TEXT字段,其中包含已分类的“文本”。
两个问题:
我应该如何确定如何索引这两个字段?(什么字段类型,要使用的类等)
目前,我有一个“ad_id”作为每个广告的唯一标识符,例如“bmw_m3_82398292”。
如果SOLR找到'查询匹配',我怎样才能让SOLR返回此标识符?
(标识符的第一部分实际上是标题字段内容,第二部分是选择的随机数)
由于
答案 0 :(得分:29)
1。模式的
您的Solr架构很大程度上取决于您的搜索行为。在schema.xml文件中,您将看到许多选项,如“text”和“string”。他们的行为不同。
<fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
字符串字段类型是文字字符串匹配。它将在SQL语句中像==
一样运行。
<fieldtype name="text_ws" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
</analyzer>
</fieldtype>
text_ws字段类型执行标记化。但是,text
字段的一个很大区别是停用词和分隔符以及下限的过滤器。注意如何为Lucene索引和Solr查询指定这些过滤器。因此,在搜索文本字段时,它会使用这些过滤器调整查询字词以帮助查找匹配项。
<fieldtype name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
<filter ..... />
<filter ..... />
<filter ..... />
</analyzer>
</fieldtype>
例如,在为新闻报道编制索引时,您可能希望以不同方式搜索公司名称和标题。
<field name="headline" type="text" />
<field name="coname" type="string" indexed="true" multiValued="false" omitNorms="true" />
以上示例允许您执行&coname:Intel&headline:processor+specifications
之类的搜索,并检索完全符合英特尔故事的匹配。
如果您想搜索范围
2。结果字段
您可以在RequestHandler
中定义一组标准的返回字段<requestHandler name="mumble" class="solr.DisMaxRequestHandler" >
<str name="fl">
category,coname,headline
</str>
</requestHandler>
您还可以使用fl
参数定义查询字符串中的所需字段。
/select?indent=on&version=2.2&q=coname%3AIn*&start=0&rows=10&fl=coname%2Cid&qt=standard
您还可以使用field:[x TO *]
语法在查询字词中select ranges。如果您想按日期选择特定广告,可以使用
ad_date:[20100101 TO 20100201]
在您的查询字词中。 (搜索范围有很多种方法,我提出的方法是使用整数而不是Date类。)