elasticsearch nest stopword过滤器不起作用

时间:2015-04-06 09:50:17

标签: elasticsearch nest

我厌倦了实现elasticsearch NEST客户端,索引文档和SQL数据,并能够完美地搜索这些内容。但我无法在这些记录上应用停用词。下面是代码。请注意我把" abc"作为我的禁言。

public IndexSettings GetIndexSettings()         {

        var stopTokenFilter = new StopTokenFilter();

        string stopwordsfilePath = Convert.ToString(ConfigurationManager.AppSettings["Stopwords"]);

        string[] stopwordsLines = System.IO.File.ReadAllLines(stopwordsfilePath);

        List<string> words = new List<string>();

        foreach (string line in stopwordsLines)
        {
            words.Add(line);
        }

        stopTokenFilter.Stopwords = words;


        var settings = new IndexSettings { NumberOfReplicas = 0, NumberOfShards = 5 };

        settings.Settings.Add("merge.policy.merge_factor", "10");
        settings.Settings.Add("search.slowlog.threshold.fetch.warn", "1s");

        settings.Analysis.Analyzers.Add("xyz", new StandardAnalyzer { StopWords = words });

        settings.Analysis.Tokenizers.Add("keyword", new KeywordTokenizer());
        settings.Analysis.Tokenizers.Add("standard", new StandardTokenizer());

        settings.Analysis.TokenFilters.Add("standard", new StandardTokenFilter());
        settings.Analysis.TokenFilters.Add("lowercase", new LowercaseTokenFilter());
        settings.Analysis.TokenFilters.Add("stop", stopTokenFilter);
        settings.Analysis.TokenFilters.Add("asciifolding", new AsciiFoldingTokenFilter());
        settings.Analysis.TokenFilters.Add("word_delimiter", new WordDelimiterTokenFilter());

        return settings;
    }

     public void CreateDocumentIndex(string indexName = null)
    {

        IndexSettings settings = GetIndexSettings();

        if (!this.client.IndexExists(indexName).Exists)
        {
            this.client.CreateIndex(indexName, c => c
                .InitializeUsing(settings)
                .AddMapping<Document>
                (m => m.Properties(ps => ps.Attachment
                                        (a => a.Name(o => o.Documents)
                                               .TitleField(t => t.Name(x => x.Name)
                                                                .TermVector(TermVectorOption.WithPositionsOffsets))))));
        }
        var r = this.client.GetIndexSettings(i => i.Index(indexName));
    }

索引数据

        var documents = GetDocuments();
        documents.ForEach((document) =>
        {
            indexRepository.IndexData<Document>(document, DOCindexName, DOCtypeName);
        });

    public bool IndexData<T>(T data, string indexName = null, string mappingType = null)
    where T : class, new()
    {
        if (client == null)
        {
            throw new ArgumentNullException("data");
        }

        var result = this.client.Index<T>(data, c => c.Index(indexName).Type(mappingType));

        return result.IsValid;
    }

在我的一份文件中,我放了一行&#34; abc&#34;而且我不认为这会被归还为#34; abc&#34;在我的禁言名单中。但是在搜索文档时它也返回上面的文档。以下是搜索查询。

    public IEnumerable<dynamic> GetAll(string queryTerm)
    {
        var queryResult = this.client.Search<dynamic>(d => d
            .Analyzer("xyz")
            .AllIndices()
            .AllTypes()
            .QueryString(queryTerm)).Documents;

        return queryResult;
    }

请建议我出错的地方。

0 个答案:

没有答案