function package provides tight control over documents scores.
Note: code snippets here should work, but they were never really compiled... so, tests sources under TestCustomScoreQuery, TestFieldScoreQuery and TestOrdValues may also be useful.
Indexing:
      f = new Field("score", "7", Field.Store.NO, Field.Index.UN_TOKENIZED);
      f.setOmitNorms(true);
      d1.add(f);
    
    Search:
      Query q = new FieldScoreQuery("score", FieldScoreQuery.Type.BYTE);
    
    Document d1 above would get a score of 7.
  
Dividing the original score of each document by a square root of its docid (just to demonstrate what it takes to manipulate scores this way)
      Query q = queryParser.parse("my query text");
      CustomScoreQuery customQ = new CustomScoreQuery(q) {
        public float customScore(int doc, float subQueryScore, float valSrcScore) {
          return subQueryScore / Math.sqrt(docid);
        }
      };
    
        For more informative debug info on the custom query, also override the name() method:
      CustomScoreQuery customQ = new CustomScoreQuery(q) {
        public float customScore(int doc, float subQueryScore, float valSrcScore) {
          return subQueryScore / Math.sqrt(docid);
        }
        public String name() {
          return "1/sqrt(docid)";
        }
      };
    
        Taking the square root of the original score and multiplying it by a "short field driven score", ie, the short value that was indexed for the scored doc in a certain field:
      Query q = queryParser.parse("my query text");
      FieldScoreQuery qf = new FieldScoreQuery("shortScore", FieldScoreQuery.Type.SHORT);
      CustomScoreQuery customQ = new CustomScoreQuery(q,qf) {
        public float customScore(int doc, float subQueryScore, float valSrcScore) {
          return Math.sqrt(subQueryScore) * valSrcScore;
        }
        public String name() {
          return "shortVal*sqrt(score)";
        }
      };