简体中文 | Elastic
Elasticsearch .NET Clients
Indexing
精确值查找【SQL】
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口风格的搜索和数据分析引擎。
Elasticsearch 存储结构
启用Elasticsearch
D:\elasticsearch-7.6.0\bin\elasticsearch.bat
检查ES是否启动成功
打开浏览器,地址栏输入http://localhost:9200/?pretty,如果看到以下画面,说明启动成功
1、管理 NuGet 程序包(N)...
Elasticsearch.Net
NEST
2、Getting started
单实例连接
var client = new ElasticClient();
var settings = new ConnectionSettings(new Uri("http://127.0.0.1:9200"))
.DefaultIndex("people");
var client = new ElasticClient(settings);
集群连接
var uris = new[]
{
new Uri("http://localhost:9200"),
new Uri("http://localhost:9201"),
new Uri("http://localhost:9202"),
};
var connectionPool = new SniffingConnectionPool(uris);
var settings = new ConnectionSettings(connectionPool)
.DefaultIndex("people");
var client = new ElasticClient(settings);
查询主要分为两种类型:精确匹配、全文检索匹配。
精确匹配:例如 term、exists、term set、 range、prefix、 ids、 wildcard、regexp、
fuzzy等。
全文检索:例如match、match_phrase、multi_match、match_phrase_prefix、query_string 等
3、Indexing
3.1、Indexing documents
/// <summary>
/// 文档索引,同步【不带参数】
/// </summary>
public void CreateIndexDocument()
{
var product = new Product
{
Id = 1
};
var indexResponse = _elasticClient.IndexDocument(product);
if (!indexResponse.IsValid)
{
// If the request isn't valid, we can take action here
}
}
/// <summary>
/// 文档索引,异步【不带参数】
/// </summary>
/// <returns></returns>
public async Task CreateIndexDocumentAsync()
{
var product = new Product
{
Id = 1
};
var indexResponseAsync = await _elasticClient.IndexDocumentAsync(product);
}
/// <summary>
/// 文档索引,设置附加参数
/// </summary>
/// <param name="Product"></param>
public void Create()
{
var product = new Product
{
Id = 1
};
_elasticClient.Index(product, idx => idx.Index("product"));
var indexResponse2 = _elasticClient.Index(new IndexRequest<Product>(product, "product"));
}
3.2、Ingest Pipelines
public void IndicesCreate()
{
_elasticClient.Indices.Create("people", c => c.Map<Person>(p => p.AutoMap().Properties(props => props.Keyword(t => t.Name("initials"))
.Ip(t => t.Name(dv => dv.IpAddress)).Object<GeoIp>(t => t.Name(dv => dv.GeoIp)))));
}
public void Reindex()
{
_elasticClient.ReindexOnServer(r => r.Source(s => s.Index("source_index")).Destination(d => d.Index("destination_index")).WaitForCompletion());
}
public IEnumerable<Product> GetProductsKeyword(Product product)
{
return _elasticClient.Search<Product>(s => s.Index("Products").Query(q =>
q.Match(mq => mq.Field(f => f.Id).Query(product.Id.ToString())))).Documents;
}
public IEnumerable<Product> GetSimpleQueryString(Product product)
{
return _elasticClient.Search<Product>(s => s.Index("Products").Query(q => q.SimpleQueryString(c => c
.Name("named_query")
.Boost(1.1)
.Fields(f => f.Field(p => p.Id).Field("myOtherField"))
.Query("hello world")
.Analyzer("standard")
.DefaultOperator(Operator.Or)
.Flags(SimpleQueryStringFlags.And | SimpleQueryStringFlags.Near)
.Lenient()
.AnalyzeWildcard()
.MinimumShouldMatch("30%")
.FuzzyPrefixLength(0)
.FuzzyMaxExpansions(50)
.FuzzyTranspositions()
.AutoGenerateSynonymsPhraseQuery(false)))).Documents;
}
4.3、exists
public IEnumerable<Product> GetExists(Product product)
{
return _elasticClient.Search<Product>(s => s.Index("Products").Query(q =>
q.Exists(t => t.Name("query").Boost(1.1).Field(p => p.Id)))).Documents;
}
4.4、term
public IEnumerable<Product> GetTerm(Product product)
{
//return _elasticClient.Search<Product>(s => s.Index("Products").Query(q => q.Term(t => t.Id, product.Id))).Documents;
return _elasticClient.Search<Product>(s => s.Index("Products").Query(q =>
q.Term(t => t.Name("named_query").Boost(1.1).Field(p => p.Id).Value("project description")))).Documents;
}
4.5、terms
public IEnumerable<Product> GetTerms(Product product)
{
return _elasticClient.Search<Product>(s => s.Index("Products").Query(q =>
q.Terms(t => t.Name("named_query").Boost(1.1).Field(p => p.Id).Terms("term1", "term2")))).Documents;
}
4.6、terms-set
public IEnumerable<Product> TermsSet(Product product)
{
return _elasticClient.Search<Product>(s => s.Index("Products").Query(q =>
q.TermsSet(c => c.Name("named_query").Boost(1.1).Field(p => p.Id).Terms("master", "dev").MinimumShouldMatchField(p => p.Id)))).Documents;
}
4.7、term-range
public IEnumerable<Product> GetTermRange(Product product)
{
return _elasticClient.Search<Product>(s => s.Index("Products").Query(q =>
q.TermRange(t => t.Name("query").Boost(1.1).Field(p => p.Id)))).Documents;
}
4.8、prefix
public IEnumerable<Product> GetPrefix(Product product)
{
var result = _elasticClient.Search<Product>(s => s.Index("Products").Query(q =>
q.Prefix(t => t.Name("query").Boost(1.1).Field(p => p.Id).Value("proj").Rewrite(MultiTermQueryRewrite.TopTerms(10))))).Documents;
return result;
}
4.9、ids
public IEnumerable<Product> GetIds(Product product)
{
var result = _elasticClient.Search<Product>(s => s.Index("Products").Query(q =>
q.Ids(t => t.Name("query").Boost(1.1).Values(1, 2, 3, 4)))).Documents;
return result;
}
4.10、Wildcard
public IEnumerable<Product> GetWildcard(Product product)
{
var result = _elasticClient.Search<Product>(s => s.Index("Products").Query(q =>
q.Wildcard(c => c.Name("named_query").Boost(1.1).Field(p => p.Id).Value("p*oj").Rewrite(MultiTermQueryRewrite.TopTermsBoost(10))))).Documents;
return result;
}
4.11、From And Size Usage
public IEnumerable<Product> GetProductsByPage(int from, int size)
{
return _elasticClient.Search<Product>(x => x.Index("Products").From(from).Size(size).Sort(x => x.Descending(v => v.Id))).Documents;
}
*、
*、
*、
*、
*、