为什么我无法搜索Solr字段中的第一个单词或最后一个单词?

时间:2016-12-01 04:08:17

标签: xml solr lucene

我是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:正在发光或其类型。

1 个答案:

答案 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字段和dplnameshining的文档。它无法找到。

在此处阅读查询解析:http://lucene.apache.org/core/2_9_4/queryparsersyntax.html