Elasticsearch 嵌套同义词 2.XX
Elasticssearch Nest Synonyms 2.XX
我是 elasticsearch 的新手,我们正在为我们的网上商店评估 elasticsearch。一个重要的特点是同义词的使用。不幸的是,我无法使用同义词创建索引。请任何人帮助我如何使用同义词功能。我没有找到此功能和 elasticsearch 2.xx 的任何示例。目标应该是如果我搜索 Hills 就会找到 Royal 的条目。
我使用以下代码:
private ElasticClient GetClient()
{
var node = new Uri(ES_URI);
var uri = new Uri("http://localhost:9200");
var settings = new ConnectionSettings(uri).DefaultIndex("product");
var client = new ElasticClient(settings);
return client;
}
public void CreateSynonymIndex()
{
Product product = new Product()
{
Id = "2",
ProductName = "Royal",
Description = "Katzenfutter für Nierkranke"
};
var client = GetClient();
client.DeleteIndex("product");
var syn = new[] { "royal, hills => royal" };
ICreateIndexResponse respose = client.CreateIndex("product", c => c
.Mappings(mp => mp.Map<Product>(d => d.
Properties(p => p.String(n => n.Name(name => name.ProductName).Index(FieldIndexOption.Analyzed)))))
.Settings(s => s
.Analysis(an => an
.Tokenizers(at=>at.Pattern("synonymTokenizer",pa=>pa.Pattern("Test")))
.Analyzers(a=>a.Custom("synonymAnalyser",ca =>ca
.Tokenizer("synonymTokenizer")
.Filters(new List<string> { "synonym" })))
.TokenFilters(tf => tf
.Synonym("synonym", sy => sy.Synonyms(syn)
.Tokenizer("whitespace")
.IgnoreCase(true)))))
);
client.Index(product);
}
public void ES_Search()
{
var client = GetClient();
var response = client.Search<Product>(search => search
.Query(q => q.Bool(b => b
.Should(
// s => s.Match(m => m.Query("sometest").Field(f => f.ProductName).Boost(1.1)),
s => s.Match(m => m.Query("hills").Field(f => f.ProductName).Fuzziness(Fuzziness.EditDistance(1)))
))));
var response1 = client.Search<Product>(s => s.Query(q => q.Term(p => p.ProductName, "hills")));
}
此致,
多米尼克
您创建了带有同义词的分析器,但您没有使用它。您需要告诉 elasticsearch ProductName
字段应该使用 synonymAnalyser
分析器。
.Mappings(mp => mp.Map<Product>(d => d.
Properties(p => p.String(n => n
.Name(name => name.ProductName)
.Analyzer("synonymAnalyser")
.Index(FieldIndexOption.Analyzed)))))
不过我还注意到了一些事情:
请记住,在调用 client.Index(..)
方法后,文档不会立即在 elasticsearch 中可用。这将需要几毫秒。索引文档后立即搜索,您可能找不到它。您可以阅读更多相关信息 here
我不知道你是否用默认索引创建了ElasticClient
,因为你没有分享它。如果没有,您将必须在搜索调用中指定它,例如
client.Search<Product>(s => s.Index("product"))
.
希望对你有所帮助。
我是 elasticsearch 的新手,我们正在为我们的网上商店评估 elasticsearch。一个重要的特点是同义词的使用。不幸的是,我无法使用同义词创建索引。请任何人帮助我如何使用同义词功能。我没有找到此功能和 elasticsearch 2.xx 的任何示例。目标应该是如果我搜索 Hills 就会找到 Royal 的条目。
我使用以下代码:
private ElasticClient GetClient()
{
var node = new Uri(ES_URI);
var uri = new Uri("http://localhost:9200");
var settings = new ConnectionSettings(uri).DefaultIndex("product");
var client = new ElasticClient(settings);
return client;
}
public void CreateSynonymIndex()
{
Product product = new Product()
{
Id = "2",
ProductName = "Royal",
Description = "Katzenfutter für Nierkranke"
};
var client = GetClient();
client.DeleteIndex("product");
var syn = new[] { "royal, hills => royal" };
ICreateIndexResponse respose = client.CreateIndex("product", c => c
.Mappings(mp => mp.Map<Product>(d => d.
Properties(p => p.String(n => n.Name(name => name.ProductName).Index(FieldIndexOption.Analyzed)))))
.Settings(s => s
.Analysis(an => an
.Tokenizers(at=>at.Pattern("synonymTokenizer",pa=>pa.Pattern("Test")))
.Analyzers(a=>a.Custom("synonymAnalyser",ca =>ca
.Tokenizer("synonymTokenizer")
.Filters(new List<string> { "synonym" })))
.TokenFilters(tf => tf
.Synonym("synonym", sy => sy.Synonyms(syn)
.Tokenizer("whitespace")
.IgnoreCase(true)))))
);
client.Index(product);
}
public void ES_Search()
{
var client = GetClient();
var response = client.Search<Product>(search => search
.Query(q => q.Bool(b => b
.Should(
// s => s.Match(m => m.Query("sometest").Field(f => f.ProductName).Boost(1.1)),
s => s.Match(m => m.Query("hills").Field(f => f.ProductName).Fuzziness(Fuzziness.EditDistance(1)))
))));
var response1 = client.Search<Product>(s => s.Query(q => q.Term(p => p.ProductName, "hills")));
}
此致,
多米尼克
您创建了带有同义词的分析器,但您没有使用它。您需要告诉 elasticsearch ProductName
字段应该使用 synonymAnalyser
分析器。
.Mappings(mp => mp.Map<Product>(d => d.
Properties(p => p.String(n => n
.Name(name => name.ProductName)
.Analyzer("synonymAnalyser")
.Index(FieldIndexOption.Analyzed)))))
不过我还注意到了一些事情:
请记住,在调用
client.Index(..)
方法后,文档不会立即在 elasticsearch 中可用。这将需要几毫秒。索引文档后立即搜索,您可能找不到它。您可以阅读更多相关信息 here我不知道你是否用默认索引创建了
ElasticClient
,因为你没有分享它。如果没有,您将必须在搜索调用中指定它,例如client.Search<Product>(s => s.Index("product"))
.
希望对你有所帮助。