1

my code is it.. using nest, elasticsearch 2.3.0 Version i want mapping( + custom analyzer) & create index ...

but mapping is not unsuccessful low level call error!

please , check my code and review for me

var node = new Uri("http://localhost:9200");
var settings = new ConnectionSettings(node);
var client = new ElasticClient(settings);
var request = new IndexExistsRequest("aa");
var result = client.IndexExists(request);
if (result.Exists == true)
{
    client.DeleteIndex("aa", null);
}
var ilhee_Custom = new CustomAnalyzer
{
    Filter = new List<string> { "lowercase", "stop", "standard", "snowball" },
    Tokenizer = "standard"
};
List<Person> categList = new List<Person>();
var Person = new Person
{
    id = 1,
    Firstname = "an apples bananas  boxes, the sun.",
    Lastname = "a beautiful womens with a good guys in there"
};
categList.Add(Person);

var response = client.CreateIndex("aa");

var mappingResponse = client.Map<Person>(d => d
    .Properties(props => props
        .String(s => s
            .Name(p => p.Firstname)
            .Index(FieldIndexOption.Analyzed)
            .Analyzer("ilhee_Custom")
        )
        .String(s1 => s1
            .Name(p1 => p1.Lastname)
            .NotAnalyzed()
        )
    )
    .Index("aa")
    .Type("person")
);

var b = client.IndexMany<Person>(categList, "aa", "person");

1 Answer 1

1

You create a custom analyzer but you don't send it to Elasticsearch, so when it comes to using it in a mapping, Elasticsearch knows nothing about the custom analyzer.

You can create a new index with analysis and mappings in one request. Here's an example of creating an index, adding your custom analyzer and mapping as part of the index creation

void Main()
{
    var node = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
    var settings = new ConnectionSettings(node)
        // set "aa" as the default index; if no index
        // is specified for a type or in the request, 
        // the default index will be used
        .DefaultIndex("aa");

    var client = new ElasticClient(settings);

    var indexExistsResponse = client.IndexExists("aa");
    if (indexExistsResponse.Exists)
    {
        client.DeleteIndex("aa", null);
    }

    var people = new List<Person>{
        new Person
        {
            id = 1,
            Firstname = "an apples bananas  boxes, the sun.",
            Lastname = "a beautiful womens with a good guys in there"
        }
    };

    var createIndexResponse = client.CreateIndex("aa", c => c
        .Settings(s => s
            .Analysis(a => a
                .Analyzers(ad => ad
                    // give the custom analyzer a name
                    .Custom("ilhee_Custom", ca => ca
                        .Tokenizer("standard")
                        .Filters("lowercase", "stop", "standard", "snowball")
                    )
                )
            )
        )
        .Mappings(m => m
            .Map<Person>(d => d
                .Properties(props => props
                   .String(s => s
                       .Name(p => p.Firstname)
                       .Analyzer("ilhee_Custom")
                   )
                   .String(s1 => s1
                       .Name(p1 => p1.Lastname)
                       .NotAnalyzed()
                    )
                )
            )
        )   
    );

    var indexManyResponse = client.IndexMany<Person>(people, "aa");

    // refresh the index after indexing, so that newly indexed documents
    // are available in search results.
    client.Refresh("aa");

    var searchResponse = client.Search<Person>(s => s
        .Query(q => q
            .Match(m => m
                .Field(p => p.Firstname)
                .Query("boxes")
            )
        )
    );
}


public class Person
{
    public int id { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set;}
}

The search returns back our indexed document as expected

{
  "took" : 9,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.15342641,
    "hits" : [ {
      "_index" : "aa",
      "_type" : "person",
      "_id" : "1",
      "_score" : 0.15342641,
      "_source" : {
        "id" : 1,
        "firstname" : "an apples bananas  boxes, the sun.",
        "lastname" : "a beautiful womens with a good guys in there"
      }
    } ]
  }
}
Sign up to request clarification or add additional context in comments.

3 Comments

i have one more question..! where can i add the stopword_path??
Define your own stop token filter with the specified stopword_path and use this in your custom analyzer - elastic.co/guide/en/elasticsearch/reference/current/…
i will try it!...Thx!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.