Meta tags and WordPress and an interesting answer

metaFirst off, what is a Meta tag???  A meta tag is text that describes your site or individual post inside of the HTML header. It was designed so search engines can quickly index your site and use the “key words” in those tags to provide more relevant results. Here are a couple of examples:

Continue reading

SEO made easy with WebSphere Commerce

In this video I show how SEO in WebSphere Commerce is a snap to configure. Short and human readible URL’s can easily be configured using the business user tooling Management Center for static pages, products, and categories. WebSphere Commerce also supports automatic 301 redirection when SEO tags are changed. This preserves the old URL to still work when referenced by search engines like Google.

Searchandizing with WebSphere Commerce

Searchandizing you say? Yep, its when you use a shoppers search terms to display relevant content like other products, specials, advertisements, and content. In this video I show how to do some basic searchandizing using WebSphere Commerce and the business user tooling Management Center. Unlike many other products, WebSphere Commerce allows basic business users to control a lot of their site, including things like search!

 

New search URL for Dojo posts

I have received a lot of positive feedback on this series so I decided to create a new link in my header “28 Days of Dojo”. The link does a tag search and sorts the results in ascending order. So if you want to read the series in order of entry you can. As the month goes I plan on making the posts more and more technical so reading in order is best for anyone just starting this stuff.

You can also bookmark the link here if you want to save it – link.

Extending the Lotus Notes Search bar

With the recently released Multiple Database Search plug-in you will see an example of how to implement the “com.ibm.rcp.search.engines.searchEngines” extension point.  This extension puts a new search entry in the search toolbar dropdown:

You can look at the plugin.xml in the project to see the extension definition.  Let’s walk through how this extension is configured:

//The first extension declares the engine 
<extension point="com.ibm.rcp.search.engines.searchEngines">
 <searchEngine
     data="1073873011"                                // Initialization data given to the class, we dont use this really
     engine="org.openntf.mailsearch.SearchEngine"     // The class name for our engine
     global="true"                                    // We want our engine to always be available
     hasResults="true"                                // We will use the regular search UI page
     icon="icon/dbicon1.gif"                          // Our icon in the drop down menu
     id="org.openntf.mailsearch.SearchEngine"         // the id of our engine
     label="Multiple DB Search"                       // The label for our engine (shows in the drop down)
     type="other"/>                                   // We are not a regular type so just put other
</extension>
//The next extension actually adds the engine to the UI, it is pretty self explanatory
<extension point="com.ibm.rcp.search.ui.searchBarSets">
  <searchBarSet
     id="org.openntf.mailsearch.SearchEngine"
     label="Multiple DB Search"
     visible="true">
     <searchBarItem
        engineID="org.openntf.mailsearch.SearchEngine"
        id="org.openntf.mailsearch.SearchEngine.item" />
  </searchBarSet>
</extension>

The engine parameter is really the key parameter as it points the search framework to our class that does the heavy lifting.  The class is what is responsible for actually executing the search across the selected databases.  Following this sample you can now create a search to essentially anything that Java code has access to.

Our search engine uses multiple threads to search across the databases.  Since the back-end Java API’s can be accessed from multiple threads this makes it a pretty big advantage performance wise.  If your databases are also full text indexed, you will see some pretty impressive performance with this technique.  I will save the threading discussion for another post…

Tracking downloads – Part 2

After a few days with the new download tracking plug-in installed on my blog I am already seeing its value – somewhat.  The release of the Multiple Database Search plug-in for Lotus Notes on OpenNTF shows 35 people have downloaded the source and install site.  The download manager WP-DownloadManager, shows 56 downloads of the widget that installs the plugin.

The problem is the log shows eight of those downloads (of the widget) to be either duplicates or multiple downloads from the same IP address.  This means the net difference is 13.  So even though the numbers are close this does show some people have more interest in just using it versus scanning the source code.

New OpenNTF Project – Multiple Database Search

Myself and Igor have just uploaded a new OpenNTF project – Multiple Database Search!

The new plug-in can be installed using the Widget below – so yes, this is a Widget that installs Eclipse plug-ins!  What we did was extend the current search user interface (the toolbar to be exact) so it looks completely integrated with the Lotus Notes client.  The tool will search specific fields or do a full text search across all of the databases and consolidate the results into a single result set.

You can install the plug-in using the widget below into your My Widgets panel in the Lotus Notes client.  If you want to learn how to enable My Widgets in your Lotus Notes client you can view a video here.

Drag image to your My Widgets panel

As with all Open Source tools and code any and all input is welcome!

Multiple database search widget

Myself and colleague (Igor Belakovskiy) will be publishing a new widget on OpenNTF that gives the end user the ability to search N number of local databases.  The first version only supports local; and yes we have plans on supporting remote servers also.   I wanted to get a broader interest in this plug-in from my reader community.  It will be distributed internally for now until we work out any glaring issues.  We plan on publishing it within the next couple of weeks.  Some key takeaways from a developer perspective are this:

  • Eclipse preference page integration
    • Preference store use
  • Back-end Java API use
  • Lotus Notes Search integration (using the extension point)
  • Integration with the search results page
  • Multithreading techniques

So in short, this solution integrates naturally with the existing search options in the Lotus Notes client.  So the user get’s a familiar look and feel.  The performance will be based on whether the databases you select are full text indexed or not.

More to come…

Searching mail and archives together

I am in the process of making what you are about to read an OpenNTF contribution but in the meantime I wanted to get some feed back on what I have come up with so far.  I wanted to extend the Lotus Notes client search with a Java plug-in that can be used in any version of Lotus Notes 8.x.  The first attempt here will really be to satisfy a customers direct need – which is basically search mail and any database stored in the local data directory under the “archives” folder.  We of course will make this configurable with a preference page and Eclipse preferences – which can then be controlled by an administrator through policies.

Search can be extended in a couple of places.  You can add your engine to the global search bar:

And the search option can show up in the right click menu when text is selected:

Continuing on, here is what I created and I figured I would just post some of the code here to give people a feel for how easy this really was.  I will go into detail about the search extension points in a later post; but what I really wanted to communicate here is I used basic back-end Java classes to accomplish this and I essentially relied on the Database Java object to do all of the search types.  The first thing I had to do was collect the results from the mail database and then iterate through all of the databases under the “archives” folder.  I gave the end user five different options for how to search, I started with Full Text but that can be very slow if your files are not indexed and then I added several other mechanisms:

  • Full Text
  • Body Field
  • Subject Field
  • Body and Subject Fields
  • Body and From Fields

As shown on the right, these options then show in the search page for the user to select how the database should be searched.

The main code is pretty simple, as I iterate through all databases I just pass the database and SearchQuery object into this private method and call the appropriate Search method on the Database object with the corresponding string or formula.  You can get an idea of it just by reading the code:

private DocumentCollection search(Database db, SearchQuery arg0) {
   try {
      if (arg0.getLocationID().equals("0"))  // Full Text
          return db.FTSearch(arg0.getText());
      else if (arg0.getLocationID().equals("1")) {  // Body Field
          return db.search("@Contains(Body; \"" + arg0.getText() + "\")");
      } else if (arg0.getLocationID().equals("2")) {  // Subject Field
          return db.search("@Contains(Subject; \"" + arg0.getText() + "\")");
      } else if (arg0.getLocationID().equals("3")) {  // Body and Subject fields
          return db.search("@Contains(Body; \"" + arg0.getText() + "\") | @Contains(Subject; \"" + arg0.getText() + "\")");
      } else if (arg0.getLocationID().equals("4")) {  // Body and From fields
          return db.search("@Contains(Body; \"" + arg0.getText() + "\") | @Contains(From; \"" + arg0.getText() + "\")");
      }

   } catch (NotesException e) {
      e.printStackTrace();
   }

   return null;
 }

You will notice I used the FTSearch method for the Full Text option and then I use the basic search method with a formula for the others.  After this method is called I then take all of the results and put them in a sorted collection by date – newer ones first.  This kind of stuff can also be controlled by preferences.

So, I have heard this request many times and now I ask, would an OpenNTF contribution using this approach be acceptable for the near term?