0

私は次の注釈付きクラス検索機能を持っています(完全ではなく、今すぐ機能させようとしているだけです):

ユーザーが「foo ba」を検索すると、結果に「foo bar」、「foo bat」などを含む行がポップアップ表示されますが、それらの用語が同じフィールドに表示されるようにしようとしています。IE の場合、タイトルが「foo」で ID が「bat」の場合は表示されませんが、タイトルが「foo bath」の行は表示されます。現在、いずれかのフィールドに単語が 1 つでも表示されると、それが返され、並べ替えもまったく機能しません (ただし、それは次のステップなので、今のところそれほど心配していません)。

    @Entity
    @Table(name="jobReq")
    @Indexed
    public class JobReq {

@Id
@DocumentId
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;

@Field(index = Index.YES)
@Column(name="jobId", nullable=false, unique=true)
private String jobId;

@Field(index = Index.YES)
@Column(name="jobTitle", nullable=false)
private String jobTitle;

@Field(index = Index.YES)
@Column(name="jobContract", nullable=false)
private String contract;

@Field(index = Index.YES)
@Column(name="jobProject", nullable=true)
private String project;

@Field(index = Index.YES)
@Column(name="jobLaborCategory", nullable=false)
private String laborCategory;

@Field(index = Index.YES)
@Column(name="jobSummary", nullable=false)
private String summary;

@Field(index = Index.YES)
@Column(name="jobDescription", nullable=false)
private String jobDescription;

@Field(index=Index.YES)
@Column(name="jobStatus", nullable=false)
private String status;

@Field(index = Index.YES)
@Column(name="TTONumber", nullable=false)
private String TTONumber;

@Field(index = Index.YES)
@Column(name="jobPostedDate", nullable=false)
@Type(type="date")
private Date postedDate;

@Field(index = Index.YES)
@Column(name="jobModifiedDate", nullable=false)
@Type(type="date")
private Date modifiedDate;


       public List<T> testingSearch() {
      Session hibernateSession = this.getSession();
      List<T> results;
        SortField field =new SortField("jobStatus", SortField.STRING);
        Sort sort = new Sort(field);
      FullTextSession fullTextSession = Search
            .getFullTextSession(hibernateSession);
      fullTextSession.beginTransaction();

      Term firstTerm = new Term("jobTitle", "entry");
      Term secondTerm = new Term("jobTitle", "ar");

      Term[] tTerms = new Term[] { firstTerm, secondTerm };
      MultiPhraseQuery multiPhrasequery = new MultiPhraseQuery();

      try {
         File index = new File("I:/com.portal.application.model.JobPosition");
         Directory indexDirectory = FSDirectory.open(index); 
         System.out.println(indexDirectory);
         PrefixTermEnum reader = new PrefixTermEnum(IndexReader.open(indexDirectory), secondTerm);
         System.out.println(reader.toString());

         List<Term> termList = new LinkedList<Term>();
         while (reader.docFreq() != -1) {
               Term t = reader.term();
               System.out.print(t);
            if (t.field().equals("jobTitle") ||  t.text().startsWith(secondTerm.text())) {
                termList.add(t);
            }
           reader.next();              
         }

         Term[] terms = termList.toArray(new Term[0]);
         multiPhrasequery.add(terms);

        org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery(multiPhrasequery, this.type).setSort(sort);
             results = hibQuery.list();
        fullTextSession.getTransaction().commit();
      } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
         results = null;
      }

      return results;
   }
4

1 に答える 1

0

修正しました。検索に最初の用語を追加するのを忘れていたことが判明しました XD

実際のクエリ テキスト: FullTextQueryImpl(jobTitle:"entry (architect artist)")

すべてを修正したコード変更:

…………

      Term firstTerm = new Term("jobTitle", "entry");
    **  Term secondTerm = firstTerm.createTerm("ar");

      Term[] tTerms = new Term[] { firstTerm, secondTerm };
      MultiPhraseQuery multiPhrasequery = new MultiPhraseQuery();

      try {
         File index = new File("I:/com.rhc.rayport.model.JobReq");
         Directory indexDirectory = FSDirectory.open(index); 
         System.out.println(indexDirectory);
         PrefixTermEnum reader = new PrefixTermEnum(IndexReader.open(indexDirectory), secondTerm);
         System.out.println(reader.toString());

         List<Term> termList = new LinkedList<Term>();
         while (reader.docFreq() != -1) {
               Term t = reader.term();
               System.out.println(t);
            if (t.field().equals("jobTitle") ||  t.text().startsWith(secondTerm.text())) {
                termList.add(t);
            }
           reader.next();              
         }

         Term[] terms = termList.toArray(new Term[0]);
         multiPhrasequery.add(firstTerm);
       **  multiPhrasequery.add(terms);

...............

于 2013-08-08T17:37:25.063 に答える