Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用nest elastic根据术语中的字数进行搜索_C#_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Nest - Fatal编程技术网 elasticsearch,nest,C#,elasticsearch,Nest" /> elasticsearch,nest,C#,elasticsearch,Nest" />

C# 使用nest elastic根据术语中的字数进行搜索

C# 使用nest elastic根据术语中的字数进行搜索,c#,elasticsearch,nest,C#,elasticsearch,Nest,我有一个电子商务网站。用户可以搜索产品。每种产品都有“名称”、“品牌”、“类别”列表。 如果用户搜索“Tommy t恤men”,则只应返回mens Tommy t恤作为结果,不应返回带有单个单词Tommy或t恤的结果。如果用户搜索“Tommy”,则应返回包含单词Tommy的所有结果。如果用户搜索“Tommy men”,则应仅返回Tommy men产品,而不返回单个匹配词Tommy或单个匹配词men 我的代码如下所示: public ISearchResponse<Models.Produc

我有一个电子商务网站。用户可以搜索产品。每种产品都有“名称”、“品牌”、“类别”列表。 如果用户搜索“Tommy t恤men”,则只应返回mens Tommy t恤作为结果,不应返回带有单个单词Tommy或t恤的结果。如果用户搜索“Tommy”,则应返回包含单词Tommy的所有结果。如果用户搜索“Tommy men”,则应仅返回Tommy men产品,而不返回单个匹配词Tommy或单个匹配词men

我的代码如下所示:

public ISearchResponse<Models.Product> Search(string term, int minMatch)
{
    var response = client.Search<Models.Product>(search => search
            .Query(q => q.Bool(b => b.Should(
            s => s.Match(m => m.Query(term).Field(f => f.ProductName).Boost(5).Fuzziness(Fuzziness.EditDistance(0))),
            s => s.Match(m => m.Query(term).Field(f => f.Brand).Boost(15).Fuzziness(Fuzziness.EditDistance(0))),
            s => s.Match(m => m.Query(term).Field(f => f.Category).Boost(10).Fuzziness(Fuzziness.EditDistance(0)))
            ).MinimumShouldMatch(minMatch))));

            return response;
}

public ISearchResponse<Models.Product> Read(string term)
{
    var fixedInput = Regex.Split(term, @"[^\p{L}]*\p{Z}[^\p{L}]*");
    int minMatch;

    if (fixedInput.Count() > 1) minMatch = 2; 
    else  minMatch = 1; 

    var results = Search(term, minMatch);

    if (!results.Documents.Any() && minMatch.Equals(2))
    {
        results = Search(term, 1);
    }

    return results;
}

public ISearchResponse搜索(字符串项,int-minMatch)
{
var response=client.Search(Search=>Search
.Query(q=>q.Bool(b=>b.Should(
s=>s.Match(m=>m.Query(term).Field(f=>f.ProductName).Boost(5).Fuzziness(Fuzziness.EditDistance(0)),
s=>s.Match(m=>m.Query(term).Field(f=>f.Brand).Boost(15).fuzzness(fuzzness.EditDistance(0)),
s=>s.Match(m=>m.Query(term).Field(f=>f.Category).Boost(10).Fuzziness(Fuzziness.EditDistance(0)))
).MinimumShouldMatch(minMatch));
返回响应;
}
公共ISearchResponse读取(字符串术语)
{
var fixedInput=Regex.Split(术语“[^\p{L}]*\p{Z}[^\p{L}]*”;
int-minMatch;
如果(fixedInput.Count()>1)minMatch=2;
else minMatch=1;
var结果=搜索(术语,最小匹配);
如果(!results.Documents.Any()&&minMatch.Equals(2))
{
结果=搜索(术语1);
}
返回结果;
}
如果我在搜索“Tommy men”,第一个结果是“Tommey men”,但其他结果是“Diesel men”,“Boss men”,如果搜索词有多个词,如何用一个词匹配筛选出结果。

你是说“Tommy”!=下面句子中的“汤米”

单个单词没有结果 汤米或t恤应该退。如果用户正在搜索“Tommy” 然后应该返回所有带有单词tommy的结果

对于其余的示例,可以使用with type

示例应用程序:

    public class Document
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Brand { get; set; }
        public string Category { get; set; }

        public override string ToString() => $"Id: {Id} Name: {Name} Brand: {Brand} Category: {Category}";
    }

    static async Task Main(string[] args)
    {
        var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
        var connectionSettings = new ConnectionSettings(pool);
        connectionSettings.DefaultIndex("documents");

        var client = new ElasticClient(connectionSettings);

        var deleteIndexResponse = await client.Indices.DeleteAsync("documents");
        var createIndexResponse = await client.Indices.CreateAsync("documents", d => d
            .Map(m => m.AutoMap<Document>()));

        var indexDocument = await client
            .IndexDocumentAsync(new Document {Id = 1, Brand = "Tommy", Category = "men"});
        var indexDocument2 = await client
            .IndexDocumentAsync(new Document {Id = 2, Brand = "Diesel", Category = "men"});
        var indexDocument3 = await client
            .IndexDocumentAsync(new Document {Id = 3, Brand = "Boss", Category = "men"});

        var refreshAsync = client.Indices.RefreshAsync();

        var query = "Tommy";
        var searchResponse = await Search(client, query);
        PrintResults(query, searchResponse);

        query = "Tommy men";
        searchResponse = await Search(client, query);
        PrintResults(query, searchResponse);

        query = "men";
        searchResponse = await Search(client, query);
        PrintResults(query, searchResponse);
    }

    private static async Task<ISearchResponse<Document>> Search(ElasticClient client, string query)
    {
        var searchResponse = await client.SearchAsync<Document>(s => s.Query(q => q
            .MultiMatch(mm => mm
                .Fields(f => f.Fields(ff => ff.Brand, ff => ff.Category, ff => ff.Name))
                .Query(query)
                .Type(TextQueryType.CrossFields)
                .MinimumShouldMatch("100%"))));
        return searchResponse;
    }

    private static void PrintResults(string query, ISearchResponse<Document> searchResponse)
    {
        Console.WriteLine($"query: {query}");
        Console.WriteLine(searchResponse.Total);
        Console.WriteLine($"results: ");
        searchResponse.Documents.ToList().ForEach(Console.WriteLine);
        Console.WriteLine();
    }
}
希望有帮助

query: Tommy
found: 1
Id: 1 Name:  Brand: Tommy Category: men

query: Tommy men
found: 1
Id: 1 Name:  Brand: Tommy Category: men

query: men
found: 3
Id: 1 Name:  Brand: Tommy Category: men
Id: 2 Name:  Brand: Diesel Category: men
Id: 3 Name:  Brand: Boss Category: men