solr exact search忽略重复短语

时间:2017-02-01 04:47:18

标签: solr

我使用solr查询从文档中搜索关键字。我希望确切的短语成为最重要的但我也想要如果同一个短语在文档中重复多次,那么它应该被计为一个,因为那些在文档中多次具有相同短语的关键词因为得分较高而得名。

请查看以下结果,我正在搜索" php开发人员",找到了两个结果,但两者都有不同的分数。

根据我们的需要,两者都应该有相同的分数。我想忽略文档中的重复短语。

请检查架构,搜索" job_search" " job_title,key_skills,key_skills_admin,job_detail"

的字段组合

        <copyField source="job_title" dest="job_search"/>
        <copyField source="key_skills" dest="job_search"/>
        <copyField source="key_skills_admin" dest="job_search"/>   
        <copyField source="job_detail" dest="job_search"/> 

        {
        "responseHeader":{
        "status":0,
        "QTime":7,
        "params":{
          "lowercaseOperators":"true",
          "mm":"2",
          "debugQuery":"true",
          "fl":"job_slno,job_title,job_detail,key_skills,key_skills_admin,display_date,score",
          "indent":"true",
          "q":"\"php developer\"",
          "stopwords":"true",
          "wt":"json",
          "defType":"edismax"}},
        "response":{"numFound":110,"start":0,"maxScore":2.518858,"docs":[
          {
            "job_slno":"243681",
            "job_title":"php developer",
            "job_detail":"sdf sdfs df",
            "key_skills":"php developer",
            "key_skills_admin":"php developer",
            "display_date":"2016-11-11T00:00:00Z",
            "score":2.518858},
          {
            "job_slno":"243340",
            "job_title":"sfsdfs",
            "job_detail":"dfsdfsdfsd",
            "key_skills":"PHP Developer",
            "key_skills_admin":"PHP Developer",
            "display_date":"2016-11-13T00:00:00Z",
            "score":2.399412},
          ]
        }

2 个答案:

答案 0 :(得分:0)

您可以创建自己的自定义Similarity类,扩展DefaultSimilarity。 并根据您的用例覆盖tf方法。

public class CustomSimilarity extends DefaultSimilarity {

        //multiple occurrences of terms doesn't affect its relevancy
        @Override
        public float tf(float freq) {
                return 1;
        }
}

答案 1 :(得分:0)

只要你不依赖于令牌的位置(就像在你没有做词组提升或类似的事情一样),you can set omitTermFreqAndPositions to true for the field

这将避免存储有关术语频率的任何信息,并且只要术语频率是唯一不同的因素,就会固有地使得得分相同。