In order to better understand the error, I copied your 
NormRemovalSimilarity and NormRemovalSimilarityProvider code snippets in 
usr/share/elasticsearch/lib. I put these 2 files in a jar named 
NormRemovalSimilarity.jar. After restarting the elasticsearch service, I 
tried to create the index with the same mapping as before (except that I 
put "type" : "NormRemoval" in the settings of my_similarity.

The result is the same: 
{"error":"IndexCreationException[[exbd] failed to create index]; nested: 
NoClassSettingsException[Failed to load class setting [type] with value 
[NormRemoval]]; nested: 
ClassNotFoundException[org.elasticsearch.index.similarity.normremoval.NormRemovalSimilarityProvider];
 
","status":500}]

I deleted the jar file just to see if the error is the same: yes it is. 
It's like the new similarity is never found or loaded. Is it still working 
without modifications on your side?
Cheers,
Patrick


Le mercredi 2 avril 2014 00:31:44 UTC-4, Ivan Brusic a écrit :
>
> It has been a while since I used a custom similarity, but what you have 
> looks right. Can you try a full class name instead? 
> Use org.elasticsearch.index.similarity.tfCappedSimilarityProvider. 
> According to the error, it is looking for org.elasticsearch.index.
> similarity.tfcappedsimilarity.tfCappedSimilaritySimilarityProvider.
>
> -- 
> Ivan
>
>
> On Tue, Apr 1, 2014 at 7:00 AM, geantbrun <agin.p...@gmail.com<javascript:>
> > wrote:
>
>> Sure.
>>
>> {
>>  "settings" : {
>>   "index" : {
>>    "similarity" : {
>>     "my_similarity" : {
>>      "type" : "tfCappedSimilarity"
>>     }
>>    }
>>   }
>>  },
>>  "mappings" : {
>>   "post" : {
>>    "properties" : {
>>     "id" : { "type" : "long", "store" : "yes", "precision_step" : "0" },
>>     "name" : { "type" : "string", "store" : "yes", "index" : "analyzed"},
>>     "contents" : { "type" : "string", "store" : "no", "index" : 
>> "analyzed", "similarity" : "my_similarity"}
>>    }
>>   }
>>  }
>> }
>>
>> If I substitute tfCappedSimilarity for tfCapped in the mapping, the 
>> error is the same except that provider is referred as 
>> tfCappedSimilarityProvider and not as tfCappedSimilaritySimilarit
>> yProvider.
>> Cheers,
>> Patrick
>>
>>
>> Le lundi 31 mars 2014 17:13:24 UTC-4, Ivan Brusic a écrit :
>>>
>>> Can you also post your mapping where you defined the similarity?
>>>
>>> -- 
>>> Ivan
>>>
>>>
>>> On Mon, Mar 31, 2014 at 10:36 AM, geantbrun <agin.p...@gmail.com> wrote:
>>>
>>>> I realize that I probably have to define the similarity property of my 
>>>> field as "my_similarity" (and not as "tfCappedSimilarity") and define in 
>>>> the settings my_similarity as being of type tfCappedSimilarity.
>>>> When I do that, I get the following error at the index/mapping creation:
>>>>
>>>> {"error":"IndexCreationException[[exbd] failed to create index]; 
>>>> nested: NoClassSettingsException[Failed to load class setting [type] 
>>>> with value [tfCappedSimilarity]]; nested: ClassNotFoundException[org.
>>>> elasticsearch.index.similarity.tfcappedsimilarity.
>>>> tfCappedSimilaritySimilarityProvider]; ","status":500}]
>>>>
>>>> Note that the provider is referred in the error as 
>>>> tfCappedSimilaritySimilarityProvider (similarity repeated 2 times). Is 
>>>> it normal?
>>>> Patrick
>>>>
>>>> Le lundi 31 mars 2014 13:06:00 UTC-4, geantbrun a écrit :
>>>>
>>>>> Hi Ivan,
>>>>> I followed your instructions but it does not seem to work, I must be 
>>>>> wrong somewhere. I created the jar file from the following two java 
>>>>> files, 
>>>>> could you tell me if they are ok?
>>>>>
>>>>> tfCappedSimilarity.java
>>>>> ***************************
>>>>> package org.elasticsearch.index.similarity;
>>>>>
>>>>> import org.apache.lucene.search.similarities.DefaultSimilarity;
>>>>> import org.elasticsearch.common.logging.ESLogger;
>>>>> import org.elasticsearch.common.logging.Loggers;
>>>>>  
>>>>> public class tfCappedSimilarity extends DefaultSimilarity {
>>>>>
>>>>>         private ESLogger logger;
>>>>>
>>>>>         public tfCappedSimilarity() {
>>>>>                 logger = Loggers.getLogger(getClass());
>>>>>         }
>>>>>
>>>>>         /**
>>>>>          * Capped tf value
>>>>>          */
>>>>>         @Override
>>>>>         public float tf(float freq) {
>>>>>                 return (float)Math.sqrt(Math.min(9, freq));
>>>>>         }
>>>>> }
>>>>>
>>>>> tfCappedSimilarityProvider.java
>>>>> *************************************
>>>>> package org.elasticsearch.index.similarity;
>>>>>
>>>>> import org.elasticsearch.common.inject.Inject;
>>>>> import org.elasticsearch.common.inject.assistedinject.Assisted;
>>>>> import org.elasticsearch.common.settings.Settings;
>>>>>
>>>>> public class tfCappedSimilarityProvider extends 
>>>>> AbstractSimilarityProvider {
>>>>>
>>>>>         private tfCappedSimilarity similarity;
>>>>>
>>>>>         @Inject
>>>>>         public tfCappedSimilarityProvider(@Assisted String name, 
>>>>> @Assisted Settings settings) {
>>>>>                  super(name);
>>>>>                 this.similarity = new tfCappedSimilarity();
>>>>>         }
>>>>>
>>>>>         /**
>>>>>          * {@inheritDoc}
>>>>>          */
>>>>>         @Override
>>>>>         public tfCappedSimilarity get() {
>>>>>                 return similarity;
>>>>>         }
>>>>> }
>>>>>
>>>>>
>>>>> In my mapping, I define the similarity property of my field as 
>>>>> tfCappedSimilarity, is it ok?
>>>>>
>>>>> What makes me say that it does not work: I insert a doc with a word 
>>>>> repeated 16 times in my field. When I do a search with that word, the 
>>>>> result shows a tf of 4 (square root of 16) and not 3 as I was expecting, 
>>>>> Is 
>>>>> there a way to know if the similarity was loaded or not (maybe in a log 
>>>>> file?).
>>>>>
>>>>> Cheers,
>>>>> Patrick
>>>>>
>>>>> Le mercredi 26 mars 2014 17:16:36 UTC-4, Ivan Brusic a écrit :
>>>>>>
>>>>>> I updated my gist to illustrate the SimilarityProvider that goes 
>>>>>> along with it. Similarities are easier to add to Elasticsearch than most 
>>>>>> plugins. You just need to compile the two files into a jar and then add 
>>>>>> that jar into Elasticsearch's classpath ($ES_HOME/lib most likely). The 
>>>>>> code will scan for every SimilarityProvider defined and load it.
>>>>>>
>>>>>> You then mapping the similarity to a field: http://www.elasticsearc
>>>>>> h.org/guide/en/elasticsearch/reference/current/mapping-core-types.
>>>>>> html#_configuring_similarity_per_field
>>>>>>
>>>>>> Note that you cannot change the similarity of a field dynamically.
>>>>>>
>>>>>> Ivan
>>>>>>
>>>>>>
>>>>>> http://www.elasticsearch.org/guide/en/elasticsearch/referenc
>>>>>> e/current/mapping-core-types.html#_configuring_similarity_per_field
>>>>>>
>>>>>>
>>>>>> On Wed, Mar 26, 2014 at 12:49 PM, geantbrun <agin.p...@gmail.com>wrote:
>>>>>>
>>>>>>> Britta is looping over words that are passed as parameters. It's 
>>>>>>> easy to implement her script for a simple query but what about boolean 
>>>>>>> querys? In my understanding (but I could be wrong of course), I would 
>>>>>>> have 
>>>>>>> to parse the query to call the script with each sub-clause, am I wrong?
>>>>>>>
>>>>>>> I prefer your custom similarity alternative. Again, sorry for the 
>>>>>>> silly question (newbie!) but where do you put your java file? Is it the 
>>>>>>> only thing that is needed (except for the modification in the mapping)?
>>>>>>> cheers,
>>>>>>> Patrick
>>>>>>>
>>>>>>> Le mercredi 26 mars 2014 11:58:52 UTC-4, Ivan Brusic a écrit :
>>>>>>>>
>>>>>>>> I am still on a version of Elasticsearch that does not have access 
>>>>>>>> to the new scoring capabilities, so I cannot test out any scripts. The 
>>>>>>>> non 
>>>>>>>> normalized term frequency should be the line:
>>>>>>>> tf = _index[field][word].tf()
>>>>>>>>
>>>>>>>> If that is the case, you could substitute that line with something 
>>>>>>>> like:
>>>>>>>> tf = Math.min(10, _index[field][word].tf())
>>>>>>>>
>>>>>>>> As a stated before, I am used to using Similarities, so I find the 
>>>>>>>> example easier. Here is a custom similarity that I used in 
>>>>>>>> Elasticsearch 
>>>>>>>> (removes any norms that are indexed):
>>>>>>>> https://gist.github.com/brusic/9786587
>>>>>>>>
>>>>>>>>  The second part would be the tf() method you would need to 
>>>>>>>> implement instead of decodeNormValue I used.
>>>>>>>>
>>>>>>>> Cheers,
>>>>>>>>
>>>>>>>> Ivan
>>>>>>>>
>>>>>>>
>>>>>>  -- 
>>>> 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 elasticsearc...@googlegroups.com.
>>>> To view this discussion on the web visit https://groups.google.com/d/
>>>> msgid/elasticsearch/6370b4dc-8243-4aea-918a-e4e4e9588aaf%
>>>> 40googlegroups.com<https://groups.google.com/d/msgid/elasticsearch/6370b4dc-8243-4aea-918a-e4e4e9588aaf%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>>  -- 
>> 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 elasticsearc...@googlegroups.com <javascript:>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/elasticsearch/f9c6111c-9c4a-427d-952e-a203f2376fb8%40googlegroups.com<https://groups.google.com/d/msgid/elasticsearch/f9c6111c-9c4a-427d-952e-a203f2376fb8%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
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/68488979-9153-430b-b349-2192717677e7%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to