我用Nest和ElasticSearch一起工作。我尝试将所有字符串字段拆分为标记。同时对托基尼尼茨使用ngram。但是,当提示查询时,我总是得到0个结果。
我的类使用api。
public class Elasticsearch
{
string index = "video-materials";
ElasticClient client;
public Elasticsearch()
{
var settings = new ConnectionSettings(new Uri("http://localhost:9200"));
client = new ElasticClient(settings);
if (client.IndexExists(index).Exists)
{
client.DeleteIndex(index);
}
var nGramFilters = new List<string> { "lowercase", "asciifolding", "nGram_filter" };
var resp = client.CreateIndex(index, c => c
.Mappings(m => m
.Map<ElasticVideoMaterial>(mm => mm
.AutoMap()
.Properties(p => p
.Text(t => t
.Name(n => n.OriginalTitle)
.Fields(f => f
.Keyword(k => k
.Name("keyword")
.IgnoreAbove(256)
)
.Text(tt => tt
.Name("ngram")
.Analyzer("ngram_analyzer")
)
)
)
)
)
)
.Settings(s => s
.Analysis(a => a
.Analyzers(anz => anz
.Custom("ngram_analyzer", cc => cc
.Filters(nGramFilters)
.Tokenizer("ngram_tokenizer")))
.Tokenizers(tz => tz
.NGram("ngram_tokenizer", td => td
.MinGram(3)
.MaxGram(3)
.TokenChars(TokenChar.Letter, TokenChar.Digit)
)
)
)
)
);
}
public void Index(IEnumerable<ElasticVideoMaterial> models)
{
foreach(var model in models)
{
client.Index(model,i=>i.Index(index));
}
}
public void Search(string query)
{
var resp = client.Search<ElasticVideoMaterial>(i => i
.Query(q => q
.Match(m => m
.Field(f => f.OriginalTitle.Suffix("ngram"))
.Query("Hob")
)
)
.Index(index)
).Documents.ToList();
}
}
我总是再次创建索引,然后索引对象列表。
为此,请使用index()方法。
这是我的索引类。
public class ElasticVideoMaterial
{
public int ID { get; set; }
public string Title { get; set; }
public string OriginalTitle { get; set; }
public float? KinopoiskRating { get; set; }
public float? Imdb { get; set; }
public int Duration { get; set; }
public List<string> GenreTitles { get; set; }
public List<string> CountryNames { get; set; }
public DateTime? ReleaseDate { get; set; }
public List<string> TranslationTitles { get; set; }
public List<string> FilmMakerNames { get; set; }
public List<string> ActorNames { get; set; }
public List<string> ThemeNames { get; set; }
public CompletionField Suggest { get; set; }
}
但是,当我尝试使用search()方法获得结果时,得到的结果是0。
(写过《霍比特人》之后,我希望能收到名字里有霍比特人的电影)