IrishMickeyWard
IrishMickeyWard

Reputation: 147

How to mimic URI query

This may be too basic of a question for SO, but I thought I would ask anyway.

I getting my feet wet with ElasticSearch and am trying to return a single document that has an exact match to my field of interest.

I have the field "StoryText" which is mapped as type "string" and indexed as "not_analyzed".

When I search using a the basic URI query:

123.456.0.789:9200/stories/storyphrases/_search?q=StoryText:"The boy sat quietly"

I return an exact matched document as I expected with a single hit.

However, when I use the search functionality:

GET 123.456.0.789:9200/stories/storyphrases/_search

{
"query" : {
    "filtered" : {
        "filter" : {
            "term" : {
                "StoryText" : "The boy sat quietly"
            }
        }
    }
}

}

I get multiple documents returned with many hits (i.e. "The boy sat loudly", "The boy stood quietly" etc. etc.)

Could somebody help me to understand how I need to restructure my search request to mimic the result I get using the basic query parameter?

At present I am using NEST in C# to generate my search request which looks like this

var searchresults = client.Search<stories>(p => p
    .Query(q => q
        .Filtered(r => r
            .Filter(s => s.Term("StoryText", inputtext))
            )
        )
    );

Thanks very much for any and all reads and or thoughts!


UPDATE: Mappings are listed below

GET /stories/storyphrases/_mappings

{
"stories": {
    "mappings": {
        "storyphrases": {
            "dynamic": "strict",
            "properties": {
                "@timestamp": {
                    "type": "date",
                    "format": "date_optional_time"
                },
                "@version": {
                    "type": "string"
                },
                "SubjectCode": {
                    "type": "string"
                },
                "VerbCode": {
                    "type": "string"
                },
                "LocationCode": {
                    "type": "string"
                },
                "BookCode": {
                    "type": "string"
                },
                "Route": {
                    "type": "string"
                },
                "StoryText": {
                    "type": "string",
                    "index": "not_analyzed"
                },
                "SourceType": {
                    "type": "string"
                },
                "host": {
                    "type": "string"
                },
                "message": {
                    "type": "string"
                },
                "path": {
                    "type": "string"
                }
            }
        }
    }
}

Mick

Upvotes: 2

Views: 108

Answers (1)

ceej
ceej

Reputation: 1893

Well, first off you are executing two different queries here. The first is running in a query context whilst the second is essentially a match_all query executing in a filtered context. If your objective is simply to emulate the first query but by passing a JSON body you will need something like

GET 123.456.0.789:9200/stories/storyphrases/_search
{
    "query" : {
        "query_string" : {
            "query" : "StoryText:'The boy sat quietly'"
        }
    }
}

To write this simple query using Nest you would use

var searchresults = client.Search<stories>(p => p.QueryString("StoryText:" + inputtext));

or in longer form

var searchresults = client.Search<stories>(p => p
    .Query(q => q
        .QueryString(qs => qs
            .Query("StoryText:" + inputtext)
            )
        )
    );

These both produce the same JSON body and send it to the _search endpoint. Assuming that storyphrases is your Elasticsearch type then you may also wish to include this in your C#.

var searchresults = client.Search<stories>(p => p
    .Index("stories")
    .Type("storyphrases")
    .Query(q => q
        .QueryString(qs => qs
            .Query("StoryText:" + inputtext)
            )
        )
    );

Having said all that and looking at your filtered query it should do what you expect according to my testing. Is your field definitely not analyzed? Can you post your mapping?

Upvotes: 1

Related Questions