首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Solr :如何解决这个用户案例

Solr :如何解决这个用户案例
EN

Stack Overflow用户
提问于 2015-03-04 09:23:08
回答 2查看 80关注 0票数 0

在Solr 4.*中,假设我有字段"mytext"

  1. "mytext“中的第一个记录是"working at ABC”。
  2. "mytext“中的第二个记录是"working at ABC project ABC”。

现在,当我搜索"Working at ABC“时,文档序列是

Doc.1:"Working at ABC project ABC

Doc2:"Working at ABC

尽管根据计算,第二个文档应该位于顶部,因为它包含了两次"ABC“(对于第二个文档,TF更高)。

但是从用户的角度来看,当查询输入“在ABC工作”时,结果应该是

代码语言:javascript
复制
"Working at ABC"

"Working at ABC project ABC"

我该如何处理这种情况。此项目只有在“公司”和“项目”有重叠数据时才会发生。就像这个例子中的"ABC"

谢谢

阿米特·阿加瓦尔

EN

回答 2

Stack Overflow用户

发布于 2015-03-04 12:41:54

您可以为字段设置omitTermFreqsAndPositions=true。只要包含规范,内容较短的字段的排名将高于内容较长的字段。

票数 0
EN

Stack Overflow用户

发布于 2015-03-05 18:41:41

而不是改变schema.xml。我覆盖TF函数,它总是返回1。因此,术语频率没有影响。

如果有人在短字段上使用Solr,那么下面是我的自定义类

代码语言:javascript
复制
private static float ARR[] = { 0.0f, 1.5f, 1.25f, 1.0f, 0.875f, 0.75f, 0.625f, 0.5f, 0.4375f, 0.375f, 0.3125f};

  /** 
   * Implemented as a lookup for the first 10 counts, then
   * <code>1/sqrt(numTerms)</code>. This is to avoid term counts below
   * 11 from having the same lengthNorm after being stored encoded as
   * a single byte.
   */
  public float lengthNorm(FieldInvertState state) {
    int numTerms = state.getLength();
    String fieldName = state.getName();

    System.out.println("field is " + fieldName  + "   number of terms are  " + numTerms);
    if( numTerms <= 10 ) {
      // this shouldn't be possible, but be safe.
      if( numTerms < 0 ) { numTerms = 0; }

      return ARR[numTerms];
    }
    //else
    return (float)(1.0 / Math.sqrt(numTerms));
  }

  // For short fields , term frequency does not always lead to relevancy so returning 1.0 
  @Override
  public float tf(float freq) {
      return (float) 1.0;
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28850689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档