elasticsearch ElasticSearch(嵌套)-忽略撇号,elasticsearch,nest,elasticsearch,Nest" /> elasticsearch ElasticSearch(嵌套)-忽略撇号,elasticsearch,nest,elasticsearch,Nest" />

elasticsearch ElasticSearch(嵌套)-忽略撇号

elasticsearch ElasticSearch(嵌套)-忽略撇号,elasticsearch,nest,elasticsearch,Nest,我对Elasticsearch很陌生。我一直在尝试实现一个相当基本的搜索功能,可以忽略撇号。我发现了这一点。对于实现,我使用了Nest库: [ElasticsearchType] public class MappingTest { [Text(Analyzer = "english")] public string Title { get; set; } } 索引/搜索: var indexName = "testindex"; var connectionSettings =

我对Elasticsearch很陌生。我一直在尝试实现一个相当基本的搜索功能,可以忽略撇号。我发现了这一点。对于实现,我使用了Nest库:

[ElasticsearchType]
public class MappingTest
{
  [Text(Analyzer = "english")]
  public string Title { get; set; }
}
索引/搜索:

var indexName = "testindex";
var connectionSettings =
    new ConnectionSettings(
        new Uri("https://url.com"))
        .DefaultIndex(indexName).EnableDebugMode();var client = new ElasticClient(connectionSettings);

if (client.IndexExists(Indices.All, descriptor => descriptor.Index(indexName)).Exists)
    client.DeleteIndex(indexName);

var response = client.CreateIndex(indexName, i => new CreateIndexDescriptor(indexName)
    .Mappings(ms => ms
        .Map<MappingTest>(m => m.AutoMap())
    ).Settings(s => s
        .Analysis(a => a
            .Analyzers(aa => aa
                .Custom("english", ca => ca
                    .Tokenizer("standard")
                    .Filters("english_possessive_stemmer", "lowercase")
                )
            )
            .TokenFilters(
                t => t.Stemmer("english_possessive_stemmer", d => d.Language("possessive_english")))
            .TokenFilters(
                t => t.Stemmer("english_stemmer", d => d.Language("english")))
            .TokenFilters(
                t => t.Stop("english_stop", d => d.StopWords("_english_")))
        )
    ));


var obj = new MappingTest() { Title = "Example's" };


var indexResponse = client.Index(obj);

var term = "example";

QueryContainer commonQuery =
    Query<MappingTest>.QueryString(qs => qs.Query(term).DefaultField(f => f.Title));

var searchResponse = client.Search<MappingTest>(s => s.Query(x => commonQuery));
var debug = searchResponse.DebugInformation;    
var indexName=“testindex”;
var连接设置=
新连接设置(
新Uri(“https://url.com"))
.DefaultIndex(indexName).EnableDebugMode();var客户端=新的ElasticClient(连接设置);
if(client.indexists(Index.All,descriptor=>descriptor.Index(indexName)).Exists)
client.DeleteIndex(indexName);
var response=client.CreateIndex(indexName,i=>newcreateindexdescriptor(indexName)
.Mappings(ms=>ms
.Map(m=>m.AutoMap())
).Settings(s=>s
.分析(a=>a
.分析仪(aa=>aa
.Custom(“英语”,ca=>ca
.Tokenizer(“标准”)
.Filters(“英语所有格词干分析器”、“小写”)
)
)
.令牌过滤器(
t=>t.Stemmer(“英语所有格词干分析器”,d=>d.Language(“英语所有格词干分析器”))
.令牌过滤器(
t=>t.Stemmer(“english_Stemmer”,d=>d.Language(“english”))
.令牌过滤器(
t=>t.Stop(“english\u Stop”,d=>d.StopWords(“\u english\u”))
)
));
var obj=new MappingTest(){Title=“Example's”};
var indexResponse=客户指数(obj);
var term=“示例”;
QueryContainer commonQuery=
QueryString(qs=>qs.Query(term).DefaultField(f=>f.Title));
var searchResponse=client.Search(s=>s.Query(x=>commonQuery));
var debug=searchResponse.DebugInformation;
我尝试了一些方法,但每次都没有得到任何结果。我希望得到一些帮助。

有几件事:

  • 您不需要指定自己的自定义
    “english”
    分析器,因为它内置于Elasticsearch中。如果要基于它,则需要按原样指定它。在这里的例子中,我认为您不想指定自己的,因为您的自定义分析器只使用
    英语所有格词干分析器
    小写
    标记过滤器
  • 多次调用
    .TokenFilters()
    将意味着只有最后一次调用获胜;调用通常在嵌套中执行赋值,所以您需要

    .TokenFilters(t => t
        .Stemmer("english_possessive_stemmer", d => d.Language("possessive_english"))
        .Stemmer("english_stemmer", d => d.Language("english"))
        .Stop("english_stop", d => d.StopWords("_english_")))
    
  • POCO属性
    Title
    上的
    Text
    属性确定用于字段的分析器

  • 在刷新间隔结束(默认值为1秒)并且新索引的文档写入新段之前,索引文档不可用于搜索。在您的示例中,我怀疑您的搜索是在文档可用于索引之前运行的
  • 我建议使用来处理分析器。您可以为您的类型创建索引和映射,然后使用特定字段的映射分析一段文本

    void Main()
    {
        var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
        var defaultIndex = "default-index";
        var connectionSettings = new ConnectionSettings(pool)
            .DefaultIndex(defaultIndex)
            .PrettyJson()
            .EnableDebugMode(response =>
                {
                    if (response.RequestBodyInBytes != null)
                    {
                        Console.WriteLine(
                            $"{response.HttpMethod} {response.Uri} \n" +
                            $"{Encoding.UTF8.GetString(response.RequestBodyInBytes)}");
                    }
                    else
                    {
                        Console.WriteLine($"{response.HttpMethod} {response.Uri}");
                    }
    
                    Console.WriteLine();
    
                    if (response.ResponseBodyInBytes != null)
                    {
                        Console.WriteLine($"Status: {response.HttpStatusCode}\n" +
                                 $"{Encoding.UTF8.GetString(response.ResponseBodyInBytes)}\n" +
                                 $"{new string('-', 30)}\n");
                    }
                    else
                    {
                        Console.WriteLine($"Status: {response.HttpStatusCode}\n" +
                                 $"{new string('-', 30)}\n");
                    }
                });
    
        var client = new ElasticClient(connectionSettings);
    
        if (client.IndexExists(defaultIndex).Exists)
            client.DeleteIndex(defaultIndex);
    
        client.CreateIndex(defaultIndex, i => i
            .Mappings(ms => ms
                .Map<MappingTest>(m => m
                    .AutoMap()
                )
            )
        );
    
        client.Analyze(a => a
            .Index(defaultIndex)
            .Field<MappingTest>(f => f.Title)
            .Text("Example's")
        );
    }
    
    [ElasticsearchType]
    public class MappingTest
    {
        [Text(Analyzer = "english")]
        public string Title { get; set; }
    }
    
    如何实现这一点?
    {
      "tokens" : [
        {
          "token" : "exampl",
          "start_offset" : 0,
          "end_offset" : 9,
          "type" : "<ALPHANUM>",
          "position" : 0
        }
      ]
    }