Hi everyone,

I'm using nGram filter for partial matching and have some problems with 
relevance scoring in my search results.

With multi_field and the standard analyzer I can boost the exact match e.g. 
"foo", which is good.
But I also want the term "barfoobar" to have a higher score than "
blablablafoobarbarbar", because the field length is shorter.
I thought this is the default in calculating the relevance score, but in 
fact they both have the same score (0.36101705).

How can I implement this?

Full demo here:

# create index

curl -XPUT 'localhost:9200/test' -d'
{
    "settings": {
        "number_of_shards": 1,
        "number_of_replicas": 0,
        "analysis": {
            "analyzer": {
                "my_index_analyzer": {
                    "type": "custom",
                    "tokenizer": "whitespace",
                    "filter": [
                        "lowercase",
                        "my_nGram"
                    ]
                },
                "my_search_analyzer": {
                    "type": "custom",
                    "tokenizer": "whitespace",
                    "filter": [
                        "lowercase"
                    ]
                }
            },
            "filter": {
                "my_nGram": {
                    "type": "nGram",
                    "min_gram": 1,
                    "max_gram": 50
                }
            }
        }
    },
    "mappings": {
        "my_type": {
            "_all": {
                "enabled": false
            },
            "properties": {
                "my_field": {
                    "type": "multi_field",
                    "fields": {
                        "my_field": {
                            "type": "string",
                            "index_analyzer": "standard",
                            "search_analyzer": "standard",
                            "include_in_all": false,
                            "boost": 10.0
                        },
                        "partial": {
                            "type": "string",
                            "index_analyzer": "my_index_analyzer",
                            "search_analyzer": "my_search_analyzer",
                            "include_in_all": false,
                            "boost": 1.0
                        }
                    }
                }
            }
        }
    }
}
'


# import data

curl -XPUT 'localhost:9200/test/my_type/1' -d '
{
    "my_field": "blablablafoobarbarbar"
}
'

curl -XPUT 'localhost:9200/test/my_type/2' -d '
{
    "my_field": "foo"
}
'

curl -XPUT 'localhost:9200/test/my_type/3' -d '
{
    "my_field": "barfoobar"
}
'


# search

curl -XGET 'localhost:9200/test/my_type/_search?pretty' -d '
{
    "query": {
        "multi_match": {
            "query": "foo",
            "fields": [
                "my_field",
                "my_field.partial"
            ],
            "operator": "and"
        }
    }
}
'


# result

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 14.054651,
    "hits" : [ {
      "_index" : "test",
      "_type" : "my_type",
      "_id" : "2",
      "_score" : 14.054651,
      "_source":
{
    "my_field": "foo"
}

    }, {
      "_index" : "test",
      "_type" : "my_type",
      "_id" : "1",
      "_score" : 0.36101705,
      "_source":
{
    "my_field": "blablablafoobarbarbar"
}

    }, {
      "_index" : "test",
      "_type" : "my_type",
      "_id" : "3",
      "_score" : 0.36101705,
      "_source":
{
    "my_field": "barfoobar"
}

    } ]
  }
}



Thanks in advance and best regards,
Torben

-- 
You received this message because you are subscribed to the Google Groups 
"elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elasticsearch+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elasticsearch/958585db-8c0a-4c9b-86b2-3df9513b5a7f%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to