Solr中的概念:分析器(analyzer)、字符过滤器(character filter)、分词器(Tokenizer)、词元过滤器(Token Filter
程序员文章站
2022-03-23 13:55:14
...
文本中包含许多文本处理步骤,比如:分词,大写转小写,词干化,同义词转化和许多的文本处理。
文本分析既用于索引时对一文本域的处理,也用于查询时查询字符串的文本处理。文本处理对搜索引擎的搜索结果有着重要的影响,特别是对如召回率的影响。
文本分析是将一个文本域的值转化为一个词序列。词是Lucene实际索引和搜索时的最小单元。分析作用于索引时原始的输入值,将转化后的词顺序保存到Lucene的索引结构中。文本分析也同样作用于查询时所输入的查询串中的查询词和查询短语,转化后的词将用于查询Lucene的索引。不用进行文本分析的查询是前缀查询,通配符查询和模糊查询。
看下面的配置:
这个配置例子定义了两个分析器,每个都指定了将文本转换为词序列的处理步骤。Type属性可以指定为index或是query值,分别表示是索引时用的分析器,和查询时所用的分析器。如果在索引和查询时使用相同的分析器,你可以不指定type属性值。上面示例中的两个分析器之间的区别很小。
分析器的配置中可以选用一个或多个字符过滤器(character filter),字符过滤器是对原始文本进行字符流级别的操作。它通常可以用于大小写转化,去除字母上标等等。在字符过滤器之后是分词器(Tokenizer),它是必须要配置的。分析器会使用分词器将字符流切分成词元(Token)系列,通常用在空格处切分这种简单的算法。后面的步骤是可选的,比如词元过滤器(Token Filter)(一般简称过滤器),会对词元(Token)进行许多种操作。最后产生的词元会被称为词(Term),即用于Lucene实际索引和查询的单位。注意有些词元过滤器如WordDelimeterFilterFactory也进行分词操作,但是它们是在词元上操作,而真正的分词器是操作一个字符流。
最后,我有必须对autoGeneratePhraseQueries布尔属性补充两句,这个属性只能用于文本域。如果在查询文本分析时产生了多个词元,比如Wi-Fi分词为Wi和Fi,那么默认情况下它们只是两个不同的搜索词,它们没有位置上的关系。但如果autoGeneratePhraseQueries被设置,那么这两个词元就构造了一个词组查询,即“WiFi”,所以索引中“WiFi”必须相邻才能被查询到。在新Solr版本中,默认它被设置为false。我不建议使用它。
参考:http://www.cnblogs.com/lvfeilong/p/34545dghfdgf.html
文本分析既用于索引时对一文本域的处理,也用于查询时查询字符串的文本处理。文本处理对搜索引擎的搜索结果有着重要的影响,特别是对如召回率的影响。
文本分析是将一个文本域的值转化为一个词序列。词是Lucene实际索引和搜索时的最小单元。分析作用于索引时原始的输入值,将转化后的词顺序保存到Lucene的索引结构中。文本分析也同样作用于查询时所输入的查询串中的查询词和查询短语,转化后的词将用于查询Lucene的索引。不用进行文本分析的查询是前缀查询,通配符查询和模糊查询。
看下面的配置:
<fieldType name="text_en_splitting" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> <analyzer type="index"> <!--<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>--> <tokenizer class="solr.WhitespaceTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_en.txt" enablePositionIncrements="true"/> <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> <filter class="solr.PorterStemFilterFactory"/> </analyzer> <analyzer type="query"> <!--<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>--> <tokenizer class="solr.WhitespaceTokenizerFactory"/> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_en.txt" enablePositionIncrements="true" /> <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> <filter class="solr.PorterStemFilterFactory"/> </analyzer> </fieldType>
这个配置例子定义了两个分析器,每个都指定了将文本转换为词序列的处理步骤。Type属性可以指定为index或是query值,分别表示是索引时用的分析器,和查询时所用的分析器。如果在索引和查询时使用相同的分析器,你可以不指定type属性值。上面示例中的两个分析器之间的区别很小。
分析器的配置中可以选用一个或多个字符过滤器(character filter),字符过滤器是对原始文本进行字符流级别的操作。它通常可以用于大小写转化,去除字母上标等等。在字符过滤器之后是分词器(Tokenizer),它是必须要配置的。分析器会使用分词器将字符流切分成词元(Token)系列,通常用在空格处切分这种简单的算法。后面的步骤是可选的,比如词元过滤器(Token Filter)(一般简称过滤器),会对词元(Token)进行许多种操作。最后产生的词元会被称为词(Term),即用于Lucene实际索引和查询的单位。注意有些词元过滤器如WordDelimeterFilterFactory也进行分词操作,但是它们是在词元上操作,而真正的分词器是操作一个字符流。
最后,我有必须对autoGeneratePhraseQueries布尔属性补充两句,这个属性只能用于文本域。如果在查询文本分析时产生了多个词元,比如Wi-Fi分词为Wi和Fi,那么默认情况下它们只是两个不同的搜索词,它们没有位置上的关系。但如果autoGeneratePhraseQueries被设置,那么这两个词元就构造了一个词组查询,即“WiFi”,所以索引中“WiFi”必须相邻才能被查询到。在新Solr版本中,默认它被设置为false。我不建议使用它。
参考:http://www.cnblogs.com/lvfeilong/p/34545dghfdgf.html
下一篇: C++vector模拟实现