Practice Every Day_12(精确搜索和模糊搜索)

            今天看了搜索的相关知识,了解了几种搜索方法。下面来总结一下:

            主要有两类方法:一类是创建Term,然后以Term为参数构建****Term

             1、词条搜索:TermQue

                   方法示例:Term t=new Term(String field,String keyword);                    

                                       TermQuery q=new TermQuery(t);

              2、组合搜索:BooleanQuery

                   方法实例:Term t1=new Term(String field,String keyword);

                                       TermQuery q1=new TermQuery(t1);

                                       Term t2=new Term(String field,String keyword);

                                       TermQuery q2=new TermQuery(t2);

                                       BooleanQuery q=new BooleanQuery();

                                       q.add(q1,BooleanClause.Occur.MUST)MUST代表必须含有;

                                       q.add(q2,BooleanClause.Occur.Not_MUST);Not_MUST代表一定不含有;SHOULD表可以有

             3、范围搜索:RangeQuery

                   方法实例:Query query=new TermRangeQuery(String field,String start,String end,Boolean inclusive,Boolean inclusive);

             4、前缀搜索:PrefixQuery

                   方法实例:Term t=new Term(String field,String keyword);                    

                                       Query q=new PrefixQuery(t);

             5、短语搜索:PhraseQuery(可以设置匹配度)

                    方法示例:Term t1=new Term(String field,String keyword);

                                         Term t2=new Term(String field,String keyword);

                                         PhraseQuery q=new PhraseQuery();

                                         q.setslop(int num);//设置t1中的keyword和t2中的keyword之间的单词数

                                        q.add(t1);

                                         q.add(t2);

               6、多短语搜索:MultiPhraseQuery

                     方法示例:Term t=new Term(String field,String keyword);

                                      Term t1=new Term(String field,String keyword);

                                      Term t2=new Term(String field,String keyword);

                                      MultiPhraseQuery q=new MultiPhraseQuery();

                                      q.add(t);//统一前缀

                                      q.add(new Term[]{t1,t2});//后缀

                7、模糊搜索:FuzzyQuery

                      方法实例: Term t=new Term(String field,String keyword);

                                           FuzzyQuery q=new FuzzyQuery(t,float f);

               8、通配符搜索:WildcardQuery

                     方法实例:Term t=new Term(String field,String keyword*);

                                         WildcardQuery q=new WildcardQuery(t);

                        常用*表示任意多个字符,用?表示任意一个字符

恩,今天有点晚了,另一类方法明天写。

我用TermQuery和FuzzyQuery写了一个程序,可是运行不出结果来,郁闷啊!

以下是代码,帮忙找找错哈!

package MySearcher;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class FuzzySearcher
{     
        private final static Analyzer analyzer=new IKAnalyzer();
        private static String ids[]={"01","02","03","04","05","06","07","08","09","10"};
        private static String names[]={"Lucy","Lily","Jerry","Mike","Tom","王琪琪","李木子","王聪聪","张小花","猪猪"};
        private static String address[]={"王大街","Green Street","White Streen","主大街","金晶大道","王府井","House Avenue","洪沟小区","张家界","Living Avenue"};
  public static void main(String[] args) throws IOException ,CorruptIndexException
  {
   String f="address";
   String s="王大街";
   int num=10;
      index();  
   System.out.println("精确搜索的结果为");
         searcher1(f,s, num);
      System.out.println("模糊搜索的结果为");
         searcher2(f,s,num);
     }
       public static void index() throws CorruptIndexException, LockObtainFailedException, IOException
       {       
        Directory directory=FSDirectory.open(new File("f:Lucene/Index_04"));
        IndexWriterConfig iwc=new IndexWriterConfig(Version.LUCENE_35,analyzer);
        IndexWriter writer=new IndexWriter(directory,iwc);   
        for(int i=0;i<ids.length;i++)
        {
         Document doc=new Document();
         doc.add(new Field("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED));
         doc.add(new Field("name",names[i],Field.Store.YES,Field.Index.ANALYZED));
         doc.add(new Field("address",address[i],Field.Store.YES,Field.Index.ANALYZED));
           writer.addDocument(doc) ;
        }
        writer.close();
       }
   public static void searcher1(String f,String s,int num) throws IOException,CorruptIndexException
   {
  Directory directory=FSDirectory.open(new File("f:Lucene/Index_04"));
  IndexReader reader= IndexReader.open(directory);
  IndexSearcher searcher=new IndexSearcher(reader);
  Term t=new Term(f,s);
  TermQuery query=new TermQuery(t);
  TopDocs tds=searcher.search(query,num);
  int total=tds.totalHits;
     System.out.println("共搜索到"+total+"条结果");
  ScoreDoc[] sds=tds.scoreDocs;
    for(ScoreDoc sd:sds)
    {
     Document doc=searcher.doc(sd.doc);
     System.out.println(doc.get("id")+doc.get("name")+doc.get("address"));
    }
    searcher.close();
   }
      public static void searcher2(String f,String s,int num) throws CorruptIndexException, IOException
  {
     Directory directory=FSDirectory.open(new File("e:Lucene实例/Index_01"));
    IndexReader reader= IndexReader.open(directory);
    IndexSearcher searcher=new IndexSearcher(reader);
    Term t=new Term(f,s);
    FuzzyQuery query=new FuzzyQuery(t,0.3f);
    TopDocs tds=searcher.search(query,num);
    int total=tds.totalHits;
       System.out.println("共搜索到"+total+"条结果");
    ScoreDoc[] sds=tds.scoreDocs;
      for(ScoreDoc sd:sds)
      {
       Document doc=searcher.doc(sd.doc);
       System.out.println(doc.get("id")+doc.get("name")+doc.get("address"));
      }
      reader.close();
      searcher.close();
     }  
}

好的,首先需要在代码引入SE注意力模块所需的库和函数: ```python import tensorflow as tf def se_block(input_feature, ratio=8): """Squeeze-and-excitation block""" channel_axis = 1 if tf.keras.backend.image_data_format() == "channels_first" else -1 channel = input_feature.shape[channel_axis] se_feature = tf.keras.layers.GlobalAveragePooling2D()(input_feature) se_feature = tf.keras.layers.Reshape((1, 1, channel))(se_feature) se_feature = tf.keras.layers.Dense(channel // ratio, activation='relu', kernel_initializer='he_normal', use_bias=True)(se_feature) se_feature = tf.keras.layers.Dense(channel, activation='sigmoid', kernel_initializer='he_normal', use_bias=True)(se_feature) if tf.keras.backend.image_data_format() == 'channels_first': se_feature = tf.keras.layers.Permute((3, 1, 2))(se_feature) se_tensor = tf.keras.layers.multiply([input_feature, se_feature]) return se_tensor ``` 然后在代码的残差块添加SE注意力模块: ```python def residual_block(inputs, filters, strides=(1, 1), use_se=True): shortcut = inputs # first block x = tf.keras.layers.Conv2D(filters=filters, kernel_size=(3, 3), strides=strides, padding='same', kernel_initializer='he_normal')(inputs) x = tf.keras.layers.BatchNormalization()(x) x = tf.keras.layers.Activation('relu')(x) # second block x = tf.keras.layers.Conv2D(filters=filters, kernel_size=(3, 3), strides=(1, 1), padding='same', kernel_initializer='he_normal')(x) x = tf.keras.layers.BatchNormalization()(x) # SE block if use_se: x = se_block(x) # shortcut connection if strides != (1, 1) or inputs.shape[-1] != filters: shortcut = tf.keras.layers.Conv2D(filters=filters, kernel_size=(1, 1), strides=strides, padding='same', kernel_initializer='he_normal')(inputs) shortcut = tf.keras.layers.BatchNormalization()(shortcut) x = tf.keras.layers.Add()([x, shortcut]) x = tf.keras.layers.Activation('relu')(x) return x ``` 这样就在代码添加了SE注意力模块。注意,这里的实现方式是在残差块嵌入SE注意力模块,而不是在整个模型添加。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值