我是Solr初学者,我刚刚将它用于我的项目1个月,从第一次起,一切都很好,但我遇到了问题。如果我有这样的句子"当你爱一个人的时候,世界就会闪耀着#34;。如果我使用'当你'或者'闪耀着#39;没有结果,但当我尝试使用'你爱'或者'世界是'或者只是'爱'或者种类,结果出现了。我想问一下如何通过schemal.xml文件进行配置,或者我做错了什么,谢谢!
这是schema.xml文件
$(".carousel").each(function(x){
var carouselId = $(this).attr('id');
var Carousel = (function($) {
'use strict';
//var wrap = $('.carousel');
var wrap = $('#' + carouselId);
var activeItemIndex = 0;
var s;
return {
settings: {
delay: 10000,
items: wrap.find('.carousel__item'),
totalItems: 0,
dots: wrap.find('.carousel__dots'),
dotLinks: wrap.find('.carousel__dot-link'),
timeout: 0,
},
init: function(args) {
if (wrap && wrap.length) {
s = $.extend({}, this.settings, args);
s.totalItems = s.items.length;
if (s.totalItems > 1) {
this.setupDotsData();
this.activate();
this.eventListeners();
wrap.addClass('active');
}
}
},
eventListeners: function() {
s.dotLinks.on('click', function() {
var index = $(this).data('index');
Carousel.stop();
Carousel.show(index);
});
},
setupDotsData: function() {
s.dots.each(function() {
$(this).find('li').each(function(index) {
$(this).data('index', index);
});
});
},
activate: function() {
if (s.totalItems > 1) {
Carousel.show(0);
} else {
s.items.eq(0).addClass('active');
}
},
show: function(index) {
s.items.removeClass('active');
s.dotLinks.removeClass('active');
s.items.eq(index).addClass('active');
s.dotLinks.filter(':nth-child(' + (index + 1) + ')').addClass('active');
activeItemIndex = index;
Carousel.play();
},
next: function(e) {
var nextItemIndex = activeItemIndex + 1 >= s.totalItems ? 0 : activeItemIndex + 1;
e && e.preventDefault();
Carousel.stop();
Carousel.show(nextItemIndex);
},
play: function() {
s.timeout = window.setTimeout(Carousel.next, s.delay);
},
stop: function() {
window.clearTimeout(s.timeout);
}
};
})(jQuery);
Carousel.init();
});
更新:我使用此查询进行搜索:dplname:正在发光或其类型。
答案 0 :(得分:1)
确定。所以你需要了解如何在solr中分析和标记文本。 在您的情况下,如果您查看schema.xml
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
这意味着虽然将应用索引文档StandardTokenizerFactory
,但会根据空格和其他一些分隔符来破坏句子。
请阅读此处了解详情https://cwiki.apache.org/confluence/display/solr/Tokenizers#Tokenizers-StandardTokenizer)
例如你的句子:
当你爱一个人时,世界就会闪耀着
将分为以下标记
何时,你,爱,某人,世界,是,闪耀
总共8个令牌。注意,
也将被删除,因为这也是一个分隔符。
然后应用StopFilterFactory
过滤器,它将删除stopwords.txt文件中存在的停用词。
(停止词是你不想索引的常用词,因为它们在搜索中没有意义。
请阅读https://cwiki.apache.org/confluence/display/solr/Filter+Descriptions#FilterDescriptions-StopFilter)
让我们假设停用词是
你的,是
所以在第二个过滤器之后你会留下这些标记(因为删除了停用词)
时,爱一个人,世界,闪耀
现在第三个过滤器是小写过滤器,它会将所有标记转换为小写。
总结当所有人说完你的句子时
当你爱一个人时,世界就会闪耀着
被索引为后续令牌
时,爱一个人,世界,闪耀
让我们谈谈搜索又名查询
在schema.xml中,您有以下内容
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
这意味着将针对每个查询执行上述分析器。
所以当你搜索dplname:shining
时
StandardTokenizerFactory将对其进行分析,因为没有分隔符shining
不会发生任何分隔符,因为它也不是一个禁用词,它不会被StopFilterFactory
删除而LowerCaseFilterFactory
只会将其更改为更低case。(如果它已经没有)
所以solr将搜索的最终标记是shining
,它在索引中找到,因此你会得到结果。
让我们看看其他查询
dplname:闪亮
注意:该字段仅对其直接位于其前的字词有效,因此在上述查询中is
会在dplname
字段中进行搜索,但由于shining
前面没有任何内容它将在默认字段中搜索(在本例中为文本字段)。
基本上查询变为(因为defaultOperator是AND,它将在查询中添加)
dplname:是AND text:shine
所以solr正在搜索文档字段中is
字段和dplname
中shining
的文档。它无法找到。
在此处阅读查询解析:http://lucene.apache.org/core/2_9_4/queryparsersyntax.html